我现在从几个来源(stackoverflow.com、cocoa-dev、文档、博客等)听说在 init 和 dealloc 方法中使用访问器和设置(foo、setFoo:) 是“错误的”。我了解,如果您这样做,则极有可能混淆正在观察该属性的其他对象。(这里给出一个简单的例子)
但是,我不得不说,我不同意这种做法,原因如下:
新的 Objective-C 运行时(iPhone 上的运行时和 10.5 中的 64 位运行时)允许您声明属性而无需声明相应的 ivar。例如,以下类将在 10.5 或 iPhone(设备,而不是模拟器)上编译得很好:
@interface Foo : NSObject { }
@property (retain) id someObject;
@end
@implementation Foo
@synthesize someObject;
@end
了解以上是一个完全有效的 Objective-C 类,假设我决定编写一个初始化程序,并且出于内存管理的目的,一个 dealloc 方法(因为 GC 在 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 方法中使用访问器有什么不好呢?