首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >没有“可能导致保留周期”的警告是否意味着不会创建一个强大的参考周期?

没有“可能导致保留周期”的警告是否意味着不会创建一个强大的参考周期?
EN

Stack Overflow用户
提问于 2012-11-12 01:59:51
回答 1查看 148关注 0票数 0

根据转换到ARC发行说明,当在块中引用self时,应该使用弱引用,以避免强引用/保留循环:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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可能会导致保留循环。没有警告是否意味着不会创建保留周期?为什么警告被限定为“可能”导致保留周期?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-12 09:15:15

没有警告是否意味着不会创建保留周期?

不是的。编译器能够确定您可以从中创建保留周期的特定条件,但它不可能排除您创建保留周期的可能性。以下面的类为例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@interface MyClass : NSObject

@property (readwrite, strong) id myObject;

@end

代码片段位于不同的类中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MyClass *one = [MyClass new];
MyClass *two = [MyClass new];

one.myObject = two;
two.myObject = one; // created a strong cycle...

要让编译器发现这个简单的循环,就需要跨多个类进行流分析,通常编译器无法解决这个问题(您可以在运行时扫描/发现循环的创建,ARC不会这样做)。

为什么警告被限定为“可能”导致保留周期?

创建一个循环本身并不是错误或不好的。循环只有在成为孤立对象时才是问题;即没有活动引用引用它,只有循环引用才会使循环中的对象保持活动状态。

当编译器在正在创建的块中看到对self的强引用时,它知道将创建一个活动的强循环,但它不能确定(即,如上所述,通常不可解)该循环稍后是否会在不再需要该块之前被打破,或者创建对象和该块是否会形成孤立循环。因此使用了非定义性的“可能”。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13337487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文