在块中调用 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
方法的类应该持有对_objectA
的zeroing weak 引用。在这种情况下,您不必担心。如果_objectA
所引用的对象先被释放,那么_objectA
在你访问的时候就是nil
,这是安全的。
【讨论】:
以上是关于在块中调用 autorelease的主要内容,如果未能解决你的问题,请参考以下文章