NSString* myAutoreleasedString = [NSString stringWithString:aString];
[self performFunctionWithAsyncronousCompletion:^(void) {
NSLog(@"My String is %@, myAutoreleasedString);
}
以上代码示例内存是否安全?闭包会自动保留并释放对myAutoReleasedString的引用,还是我应该自己实现?
修改
禁用Arc。
答案 0 :(得分:1)
在非ARC块(Closure)中,只有当“复制”(块将从堆栈复制到堆)时才会保留变量,并将其发送到块对象。 (所以如果你用修饰符副本保护你的块到属性 - 一切都会好的)。 同样在您的示例中 - 变量将在释放后正确释放(解除分配的块变量)。
如果不是,您可能会崩溃(如果您的变量已被删除,您的块将被执行)。 __block修饰符不告诉编译器保留对象。请改用__strong。
答案 1 :(得分:0)
是的,它是安全的,因为ObjC块保留了它们引用的对象。 只要您不是字符串对象的所有者,就不需要为此对象添加额外的内存管理。
您可以使用__block
关键字明确定义不会保留的变量,以避免参考周期。 (即__block doNotRetainMeInBlock obj = ...
)