【发布时间】:2011-07-08 14:10:42
【问题描述】:
我偶然发现了一个有趣的情况,当对象可以释放自己时,我想知道在这种情况下什么被认为是安全和正确的。
假设我们有一个类 Foo:
@implementation Foo
+ (Foo *) foo {
return [[[Foo alloc] init] autorelease];
}
- (void)resign {
[FooHolder holder].foo = nil;
// here's where the things happen
}
@end
另一个类是 FooHolder(具有一个属性的单例):
@interface FooHolder : NSObject {
Foo *foo;
}
@property (retain) Foo *foo;
+ (FooHolder *)holder;
@end
我们在代码中的某处执行此操作(首先调用stepOne,然后调用stepTwo;自动释放池在stepOne 完成后耗尽):
- (void)stepOne {
Foo *foo = [Foo foo];
[FooHolder holder].foo = foo;
}
- (void)stepTwo {
[[FooHolder holder].foo resign]
}
如果我尝试在resign 方法中访问self,在分配后,使用NSZombieEnabled,我会收到self 已被释放的警告。这给了我短暂的 WTF 时刻,但是好吧,我可以在这部分不访问 self 生活。更让我烦恼的是,如果对象已经被释放,谁能保证堆栈没有损坏,并且我们正在正常处理我们的本地和实例变量?一般来说,在方法中允许self 被释放是一种不好的做法吗?
【问题讨论】:
-
点的特殊用法看起来很丑;我建议只使用常规方法调用语法。
标签: objective-c