我是否需要保留闭包中引用的自动释放对象?

时间:2015-04-13 11:17:27

标签: ios objective-c

NSString* myAutoreleasedString = [NSString stringWithString:aString];

[self performFunctionWithAsyncronousCompletion:^(void) {
    NSLog(@"My String is %@, myAutoreleasedString);
}

以上代码示例内存是否安全?闭包会自动保留并释放对myAutoReleasedString的引用,还是我应该自己实现?

修改

禁用Arc。

2 个答案:

答案 0 :(得分:1)

在非ARC块(Closure)中,只有当“复制”(块将从堆栈复制到堆)时才会保留变量,并将其发送到块对象。 (所以如果你用修饰符副本保护你的块到属性 - 一切都会好的)。 同样在您的示例中 - 变量将在释放后正确释放(解除分配的块变量)。

如果不是,您可能会崩溃(如果您的变量已被删除,您的块将被执行)。 __block修饰符不告诉编译器保留对象。请改用__strong。

答案 1 :(得分:0)

是的,它是安全的,因为ObjC块保留了它们引用的对象。 只要您不是字符串对象的所有者,就不需要为此对象添加额外的内存管理。

您可以使用__block关键字明确定义不会保留的变量,以避免参考周期。 (即__block doNotRetainMeInBlock obj = ...