次のコードには、メモリ管理の問題があります。
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];
});
ブロックがオブジェクトを解放した後に自動解放プールが空になるようですが、それが保証されているかどうかわからないので、このコードが有効かどうかはわかりません。