1

私は現在、ARCで構築されていないレガシーアプリでのiOS 7の表示の問題の修正に取り組んでおり、deallociOSバージョン6と7の間の方法で一貫性のない動作に遭遇しました。これらについての他の言及は見つかりませんドキュメンテーションまたはコミュニティの議論の変更なので、ここで何が起こっているのかを明らかにできる人はいますか?

私の以前のコード(iOS6で動作するものは次のようになります):

@interface MyViewController()
@property (retain) AdHandler *adHandler;
@end

@implementation MyViewController

@synthesize adHandler = _adHandler;

- (id) initWithAdHandler:(AdHandler*)anAdHandler
{
    self = [super init];
    _adHandler = [anAdHandler retain];
    return self;
}

- (void)dealloc
{    
    [super dealloc];

    [_adHandler release];
    _adHandler = nil;
}

...

@end

iOS 6 のコードをステップ実行すると、deallocステートメントの後、[_adHandler retainCount]まだ肯定的であり、オブジェクトがまだ利用可能であることがわかりました。

ただし、iOS 7 では、deallocステートメントの後、何らかの理由でretainCountゼロになり、_adHandlerオブジェクトがdealloc'd になったため、 への呼び出しで.releaseEXC_BAD_ACCESS

[adHandler release]通話を通話の前に移動するだけでこれを修正できますdeallocが、私の質問はなぜこれが起こっているのですか? dealloc責任のないオブジェクトを解放するのはなぜですか? dealloc の動作がこのように変更された理由に関するドキュメントはどこかにありますか?

4

2 に答える 2