0

在下面的代码中,我试图将对象添加到数组中。没有错误,但也没有添加对象。很抱歉问了这个非常基本的问题。需要帮忙

NS 对象定义
//DataDefinition.h #import

@interface DataDefinition : NSObject
@property (nonatomic, retain) NSString *dataHeader;
@property (nonatomic, retain) NSMutableArray *dataDetails;

@end

数据定义实现

#import "DataDefinition.h"
@implementation DataDefinition

@synthesize dataHeader;
@synthesize dataDetails;

@end

显示标题部分 //DataDisplay.h #import

#import "DataDefinition.h"

@interface DataDisplay : UITableViewController
@property (strong, nonatomic) NSMutableArray *dataSet;
@property (strong, atomic) DataDefinition *individualData;

@end

显示实施部分

 //DataDisplay.m
 #import "DataDisplay.h"

 @interface DataDisplay ()
 @end

 @implementation DataDisplay
 @synthesize dataSet;
 @synthesize individualData;

- (void)viewDidLoad
{

    [super viewDidLoad];

    individualData.dataHeader  = @"Header1";
    individualData.dataDetails = [[NSMutableArray alloc] initWithObjects:@"Header1-Detail1", @"Header1-Detail2", @"Header1-Detail3", nil];

    //This didnot add
    [dataSet addObject:individualData];
    NSLog(@"Count of objects is %d:",[dataSet count]);

    //Nor did this
    dataSet = [[NSMutableArray alloc] initWithObjects:individualData, nil];
    NSLog(@"Count of objects is %d:",[dataSet count]);

    self.title = @"DataDisplay";
}
4

1 回答 1

1

问题是它individualData实际上从未设置为实例化对象(换句话说,它从未被初始化)。

由于 Objective-C 关于向 nil 发送消息的无错误策略,这些疏忽很常见;这是完全合法且通常有用的原则。这意味着你的代码永远不会抱怨,直到你尝试将它传递给某个方法,如果它看到 nil 就会崩溃。不幸的是,您使用的是initWithObjects,它只是将 nil 视为(空)列表的末尾。如果您改为尝试使用[NSArray arrayWithObject:individualData],您可能会看到一个错误,提示您使用 nil 而不是对象。

请注意,在 nil 上设置属性特别棘手,因为看起来您只是在处理 C-syle lvalue,而实际上它在运行时转换为消息发送调用:

individualData.dataHeader  = @"Header1"; 
// is *literally* the same as:
[individualData setDataHeader:@"Header1"]; 

您可以选择解决方案。“便宜”的方法是简单地在那里初始化它。“更好”的方式(通常)是惰性实例化(即在 getter 中)。由于该对象被标记为atomic,您可能需要让编译器为您编写 getter,并在 viewDidLoad (或 awakeFromNib、initWithCoder 或类似的)中对其进行初始化:

- (void)viewDidLoad
{

    [super viewDidLoad];
    self.individualData = [[DataDefinition alloc] init];
    ...
于 2012-08-26T02:02:56.557 回答