Objective c 是否缺少一个;可能导致一个保留周期”;警告意味着不会创建强引用循环?
根据向ARC转换的发布说明,在块内引用自身时,应使用弱引用,以避免强引用/保留循环:Objective c 是否缺少一个;可能导致一个保留周期”;警告意味着不会创建强引用循环?,objective-c,xcode,llvm,block,retain-cycle,Objective C,Xcode,Llvm,Block,Retain Cycle,根据向ARC转换的发布说明,在块内引用自身时,应使用弱引用,以避免强引用/保留循环: MyViewController *myController = [[MyViewController alloc] init…]; // ... MyViewController * __weak weakMyController = myController; myController.completionHandler = ^(NSInteger result) { MyViewController *
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可能会导致retain循环。没有警告是否意味着不会创建保留循环?为什么警告被限定为“可能”导致保留周期
没有警告是否意味着不会创建保留循环
不可以。编译器能够确定某些条件,您可以根据这些条件创建保留循环,但它不可能排除您创建保留循环的可能性。作为一个例子,考虑下面的类:
@interface MyClass : NSObject
@property (readwrite, strong) id myObject;
@end
以及不同类中的代码片段:
对于一个编译器来说,要想发现这个简单的循环,需要跨多个类进行流分析,并且通常这个问题是编译器无法解决的(您可以在运行时扫描/发现循环的创建,ARC不会这样做)
为什么警告被限定为“可能”导致保留周期
创造一个循环本身并没有错或坏。只有当循环变成孤立时,它才是一个问题;i、 e.没有活动引用,只有循环引用导致循环中的对象保持活动
当编译器在正在创建的块中看到对self的强引用时,它知道将创建一个活动的强循环,但它无法确定(即,如上所述的无法解决的一般情况)该循环是否会在不再需要该块之前中断,或者创建对象和该块是否将形成一个孤立循环。因此,使用不确定的“可能”
没有警告是否意味着不会创建保留循环
不可以。编译器能够确定某些条件,您可以根据这些条件创建保留循环,但它不可能排除您创建保留循环的可能性。作为一个例子,考虑下面的类:
@interface MyClass : NSObject
@property (readwrite, strong) id myObject;
@end
以及不同类中的代码片段:
对于一个编译器来说,要想发现这个简单的循环,需要跨多个类进行流分析,并且通常这个问题是编译器无法解决的(您可以在运行时扫描/发现循环的创建,ARC不会这样做)
为什么警告被限定为“可能”导致保留周期
创造一个循环本身并没有错或坏。只有当循环变成孤立时,它才是一个问题;i、 e.没有活动引用,只有循环引用导致循环中的对象保持活动
当编译器在正在创建的块中看到对self的强引用时,它知道将创建一个活动的强循环,但它无法确定(即,如上所述的无法解决的一般情况)该循环是否会在不再需要该块之前中断,或者创建对象和该块是否将形成一个孤立循环。因此使用了非确定的“可能”。我认为使用“可能”一词是因为编译器无法确定是否会创建一个循环。它只使用块内对self的引用作为启发,以表明可能会创建一个循环。我认为使用“可能”一词是因为编译器无法确定是否会创建一个循环。它仅使用块内对self的引用作为启发,以建议可能创建一个循环。