根据转换到ARC发行说明,当在块中引用self时,应该使用弱引用,以避免强引用/保留循环:
MyViewController *myController = [[MyViewController alloc] init…];
// ...
MyViewController * __weak weakMyController = myController;
myController.completionHandler = ^(NSInteger result) {
MyViewController *strongMyController = weakMyController;
if (strongMyController) {
// ...
[strongMyController dismissViewControllerAnimated:YES completion:nil];
// ...
}
else {
// Probably nothing...
}
};
有时,我会收到一个编译器警告,在代码块中引用self可能会导致保留循环。没有警告是否意味着不会创建保留周期?为什么警告被限定为“可能”导致保留周期?
发布于 2012-11-12 09:15:15
没有警告是否意味着不会创建保留周期?
不是的。编译器能够确定您可以从中创建保留周期的特定条件,但它不可能排除您创建保留周期的可能性。以下面的类为例:
@interface MyClass : NSObject
@property (readwrite, strong) id myObject;
@end
代码片段位于不同的类中:
MyClass *one = [MyClass new];
MyClass *two = [MyClass new];
one.myObject = two;
two.myObject = one; // created a strong cycle...
要让编译器发现这个简单的循环,就需要跨多个类进行流分析,通常编译器无法解决这个问题(您可以在运行时扫描/发现循环的创建,ARC不会这样做)。
为什么警告被限定为“可能”导致保留周期?
创建一个循环本身并不是错误或不好的。循环只有在成为孤立对象时才是问题;即没有活动引用引用它,只有循环引用才会使循环中的对象保持活动状态。
当编译器在正在创建的块中看到对self的强引用时,它知道将创建一个活动的强循环,但它不能确定(即,如上所述,通常不可解)该循环稍后是否会在不再需要该块之前被打破,或者创建对象和该块是否会形成孤立循环。因此使用了非定义性的“可能”。
https://stackoverflow.com/questions/13337487
复制相似问题