2

重複の可能性:
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 に切り替えた利点の 1 つは、保持されているオブジェクト参照を解放するためだけに dealloc メソッドを実装する必要がほとんどなかったことです。ゾンビを有効にすると、開発中にあらゆる種類の間違いを見つけなければならないのに便利ですが、この利点は実現できないようです。保持されている参照を に設定するためだけに、dealloc メソッドを実装する必要がありますnil

ここで何かが足りないのですか、それとも ARC とゾンビを混在させたときにこれが本当に予想される動作ですか?

4

0 に答える 0