在向阵列添加对象时遇到问题

时间:2012-08-26 01:08:52

标签: xcode ios5.1

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

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

@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

#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 个答案:

答案 0 :(得分:1)

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

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

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

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];
    ...