今天早上我在我正在开发的 iPhone 应用程序中遇到了崩溃,当我修复这个错误时,我很好奇这是一个问题的语法原因。
这是我简化为简单元素的代码。我正在使用 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];
}
现在,当我第一次编写该方法时,我不小心遗漏了“self”。这导致了炸弹。虽然在测试时,它乍一看是有效的。我试过:
stuff = arr;
NSLog(@"%d", [stuff count]);
但是在其他方法中使用 stuff 遭到轰炸。现在我已经解决了这个问题,我可以在其他地方使用 [stuff count]。
那么为什么我可以在某些地方使用 stuff 而在其他地方我必须使用 self.stuff?
最佳答案
当您使用 (self) 和点语法时,考虑到您定义属性 (nonatomic, retain) 的方式,NSArray (stuff) 将被保留。
如果不这样做,您仍然在进行赋值,但除了通过 alloc+init 进行的隐式保留之外,您并没有保留数组 - 您会立即释放它。
您可以通过以下方式绕过“self.stuff = arr”分配:
stuff = [arr retain];
但是既然你定义了一个属性,你显然想要使用点语法并为你调用保留。
关于objective-c - 在不使用自引用的情况下设置 Objective-C 类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1295702/