ARC with zombies - 为什么在取消分配拥有对象时,实例变量中的对象不会被释放?

时间:2012-01-13 21:31:55

标签: objective-c ios automatic-ref-counting nszombie

  

可能重复:
  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与僵尸混合时的预期行为吗?

0 个答案:

没有答案