【发布时间】: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