在块中调用 autorelease

Posted

技术标签:

【中文标题】在块中调用 autorelease【英文标题】:Calling autorelease in a block 【发布时间】: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有区别吗? 【参考方案1】:

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

【讨论】:

以上是关于在块中调用 autorelease的主要内容,如果未能解决你的问题,请参考以下文章

如何在块中调用 link_to 辅助方法,在使用类的同时链接到图像文件?

在块中复制和自动释放本地变量

ALAssetLibraryGroup 在块中找到相机胶卷

有人可以解释 Ruby 在块中使用管道字符吗?

无法在块中翻译 Django 模板

如何在块中使用 File.ReadAllBytes