今天早上我遇到了一个iPhone应用程序崩溃,当我修复这个bug时,我很好奇它是一个问题的句法原因。在不使用自引用的情况下设置Objective-C类属性
这里是我的代码简化为简单的元素。我使用NSArray为项目填充TableView中的项目。该NSArray的是一个属性:
@interface FooViewController : UITableViewController {
NSArray *stuff;
}
@property (nonatomic, retain) NSArray *stuff;
在我的实现文件:
@synthesize stuff;
- (void)viewDidLoad {
NSArray *arr = [[NSArray alloc] initWithObjects:@"", @"Item 1", @"Item 2",
@"Lorem", @"Ipsum", nil];
self.stuff = arr;
[arr release];
}
现在,当我第一次写的方法,我不小心不放过的“自我”。并导致了炸弹。虽然在测试时,它一开始就表现出色。我会尝试:用东西在轰炸其他方法
stuff = arr;
NSLog(@"%d", [stuff count]);
不过。现在我已经解决了这个问题,我可以在其他地方使用[stuff count]。
那么,为什么我可以在一些地方使用东西但在其他地方我必须使用self.stuff?
如果您打算使用属性,那么您应该在任何地方使用它们,即dealloc内容应该简单地读取: self.stuff = nil; 帮助避免出错的常用方法是声明实例变量: NSArray * _stuff; 属性声明保持不变,但合成语句现在应该如下所示: @synthesize stuff = _stuff; 现在,每次尝试使用没有自己的东西时,编译器都会标记错误。 – 2010-02-08 09:41:37
实际上Apple建议在dealloc中直接释放类变量,而不是使用属性 - 这是因为如果使用属性,可能会触发KVC通知,或者可能会通过覆盖合成的get/set方法启动其他副作用。 – 2010-02-08 20:18:05
感谢您的提示。我想知道这是如何相关,特别是因为可能不想* KVO触发?更不用说在现代运行时中,我们将*拥有使用访问器和合成实例变量的机会。我想苹果正在确保他们的代码能够抵御这种情况。到目前为止,我还没有遇到任何与我的代码有关的问题,但是现在我已经警告过了:-) – 2010-02-21 23:50:15