我从多个渠道(包括stackoverflow.com、cocoa-dev、文档、博客等)了解到,在init和dealloc方法中使用访问器和设置器(foo,setFoo:)是“错误”的行为。我理解如果这样做会有可能会给观察该属性的其他对象带来困惑,这里提供了一个简单的例子(在这里)。
然而,出于以下原因,我不同意这种做法:
新的Objective-C运行时(适用于iPhone和10.5中的64位运行时)允许您声明属性而无需声明相应的实例变量。例如,下面的类将在10.5或iPhone上编译通过(设备,非模拟器):
@interface Foo : NSObject { }
@property (retain) id someObject;
@end
@implementation Foo
@synthesize someObject;
@end
理解上述代码是一个完全有效的Objective-C类,假设我要编写一个初始化方法和一个dealloc方法(因为iPhone上没有垃圾回收),以进行内存管理。所有我读过的与初始化方法和释放内存相关的资料都会引导我编写以下两个方法:
- (id) init {
if (self = [super init]) {
//initialize the value of someObject to nil
[self setSomeObject:nil];
}
return self;
}
- (void) dealloc {
//setting someObject to nil will release the previous value
[self setSomeObject:nil];
[super dealloc];
}
然而,根据文档和普遍意见,这样做是“错误”的。所以我的问题是:
- 如果不能使用访问器,我应该如何初始化someObject?您可能会说编译器(或运行时或其他什么东西)会确保someObject已设置为nil,但我认为依赖于这一点是不恰当的行为。作为一个对C有相当背景的人,我看到过很多因为没有正确初始化变量而导致的错误,这似乎与它们很不一样。
- 如果在dealloc方法中不应该使用访问器,我该如何释放someObject?
如果答案是“你不能”,那么在init和dealloc方法中使用访问器会有什么问题呢?