可能重复:
Why is object not dealloc'ed when using ARC + NSZombieEnabled
在使用ARC并启用了僵尸对象的项目中,如果某个对象在取消分配时拥有对另一个对象的强引用,则该另一个对象不会被释放。
此代码演示了此问题:
@interface TestInner : NSObject
@end
@implementation TestInner
- (id)init {
if ( (self = [super init]) ) {
}
NSLog(@"-[TestInner init]: %p", self);
return self;
}
- (void)dealloc {
NSLog(@"-[TestInner dealloc]: %p", self);
}
@end
@interface TestOuter : NSObject
@end
@implementation TestOuter {
TestInner * _inner;
}
- (id)init {
if ( (self = [super init]) ) {
_inner = [[TestInner alloc] init];
}
NSLog(@"-[TestOuter init]: %p", self);
return self;
}
- (void)dealloc {
NSLog(@"-[TestOuter dealloc]: %p", self);
// _inner will not release without this if zombies are enabled
//_inner = nil;
}
@end
分配和释放TestOuter实例会产生以下日志消息:
-[TestInner init]: 0x9d00f00
-[TestOuter init]: 0x9d00f30
-[TestOuter dealloc]: 0x9d00f30
TestInner实例永远不会被释放。但是,关闭僵尸会导致TestInner实例被释放。
切换到ARC的一个好处是我们很少需要实现dealloc方法来简单地释放持有的对象引用。似乎启用了僵尸,这对于在开发过程中捕获各种错误很有用,这种好处是无法实现的。我仍然需要实现dealloc方法,只是为了设置我对nil
的引用。
我在这里遗漏了什么,或者这是将ARC与僵尸混合时的预期行为吗?