在块中调用自动释放

时间:2013-03-15 23:17:09

标签: objective-c objective-c-blocks grand-central-dispatch autorelease nsautoreleasepool

以下代码存在内存管理问题:

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。在自我的dealloc中,它触及objectA。如果objectA已被解除分配,则会出现此问题。我知道通过在块中引用这些对象,它们将被保留,但我不确定无论如何都要确定它们将以何种顺序发布。

似乎有用的一件事是:

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

似乎在块释放对象后,自动释放池被耗尽,但我不确定这是保证,所以我不知道这段代码是否有效。

1 个答案:

答案 0 :(得分:0)

实施-dealloc方法的类应该包含对_objectA归零弱引用。在这种情况下,您不必担心它。如果_objectA引用的对象首先被取消分配,那么当您访问它时_objectA将为nil,这是安全的。