在下面的代码中,我试图将对象添加到数组中。没有错误,但也没有添加对象。很抱歉问这个非常基本的问题。需要帮助
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";
}
答案 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];
...