0

次のコードには、メモリ管理の問題があります。

dispatch_after(someTime, dispatch_get_main_queue(), ^(void){
                [objectA doSomething];
                [self doSomethingDifferent];
            });


//self’s dealloc:

- (void)dealloc
{
   _objectA.delgate = nil; //objectA’s delegate is this object;
   [super dealloc]
}

「self」は objectA への参照を持っていますが、objectA を保持していません。self の dealloc では、objectA に触れます。これは、objectA が既に割り当て解除されている場合に問題になります。これらのオブジェクトをブロック内で参照することで保持されることはわかっていますが、解放される順序を決定する方法があるかどうかはわかりません。

うまくいくように見えることの1つはこれです:

dispatch_after(someTime, dispatch_get_main_queue(), ^(void){
                [[objectA retain] autorelease];
                [objectA doSomething];
                [self doSomethingDifferent];
            });

ブロックがオブジェクトを解放した後に自動解放プールが空になるようですが、それが保証されているかどうかわからないので、このコードが有効かどうかはわかりません。

4

1 に答える 1

0

その-deallocメソッドが実装されているクラスは、 へのゼロ化弱参照を保持する必要があり_objectAます。その場合、心配する必要はありません。によって参照されるオブジェクト_objectAが最初に割り当て解除された場合は、アクセスしたときに安全になります_objectAnil

于 2013-03-16T04:59:40.807 に答える