2012-08-26 57 views
0

在下面的代码中,我试图将对象添加到数组。没有错误,但不添加对象。对不起,问这个非常基本的问题。需要帮助添加对象到数组时遇到问题

的NS对象定义
//DataDefinition.h #进口

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

@end 

的DataDefinition实现

#import "DataDefinition.h" 
@implementation DataDefinition 

@synthesize dataHeader; 
@synthesize dataDetails; 

@end 

的显示表头部分 //DataDisplay.h #进口

#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"; 
} 

回答

1

的问题是,individualData实际上从来不设置为一个实例化的对象(换句话说,这是从来没有初始化)。

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

注意,在无设置属性是特别棘手,因为它看起来像你只是用C-SYLE处理左值的时候,居然将其转换为一个消息发送呼叫在运行时:

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

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

- (void)viewDidLoad 
{ 

    [super viewDidLoad]; 
    self.individualData = [[DataDefinition alloc] init]; 
    ... 
+0

我尝试这样做。但是我得到一个错误,表示'DataDefinition'没有可见的@interface声明选择器'alloc' – user1509593

+0

您是否在DataDisplay.m文件中导入了正确的标题?即该文件是否具有到DataDefinition.h文件的简洁#import路径?如果这个类扩展了NSObject,那就不应该有两种方式; alloc/init在那里。 –

+0

好吧,DataDefinition.h是由File - > New - > File(Cocoa touch,Objective C)类创建的NSObject。 DataDisplay.h有#import“DataDefinition.h”和DataDefinition.m有#import“DataDisplay.h” – user1509593