【问题标题】:Calling autorelease in a block在块中调用 autorelease
【发布时间】:2013-03-15 23:17:08
【问题描述】:

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

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 已被释放,这将是一个问题。我知道通过在块中引用这些对象,它们将被保留,但我不确定是否可以确定它们将以什么顺序被释放。

似乎可行的一件事是:

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

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

【问题讨论】:

  • 您展示的代码片段无法让我们看到发生了什么。例如,objectA 是局部变量吗?实例变量?全局变量?和_objectA有区别吗?

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


【解决方案1】:

实现-dealloc 方法的类应该持有对_objectAzeroing weak 引用。在这种情况下,您不必担心。如果_objectA所引用的对象先被释放,那么_objectA在你访问的时候就是nil,这是安全的。

【讨论】:

    猜你喜欢
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多