Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 是否缺少一个;可能导致一个保留周期”;警告意味着不会创建强引用循环?_Objective C_Xcode_Llvm_Block_Retain Cycle - Fatal编程技术网

Objective c 是否缺少一个;可能导致一个保留周期”;警告意味着不会创建强引用循环?

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 *

根据向ARC转换的发布说明,在块内引用自身时,应使用弱引用,以避免强引用/保留循环:

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的引用作为启发,以建议可能创建一个循环。