【发布时间】:2013-10-09 13:43:27
【问题描述】:
我对按钮有以下操作,它可以切换对象是显示为收藏还是非收藏:
- (IBAction)addToFavorites:(UIButton *)sender {
if ([object isFavorite]) {
[_apiManager removeFromFavorite:[object ID] withCompletion:^ {
[_favoriteButton setImage:[UIImage imageNamed:@"favorite"] forState:UIControlStateNormal];
}];
}
else {
[_apiManager addToFavorite:[object ID] withCompletion:^ {
[_favoriteButton setImage:[UIImage imageNamed:@"favorite_yellow"] forState:UIControlStateNormal];
}];
}
}
两个完成块是相同的,除了图像名称。
XCode 向else 案例发出警告:Capturing 'self' strongly in this block is likely to lead to a retain cycle 并指向_favoriteButton。
但是,if 条件为 true 时不会发生同样的情况。
我想这两种情况都应该出现警告,或者都不应该出现警告,我不明白为什么只有后一种情况才会出现。这是一个 Xcode 错误吗?两者都会导致保留周期吗?
【问题讨论】:
-
如果注释掉
else分支,它不会在剩余的分支中给出警告吗?如果是这种情况,您可能刚刚看到编译器将相同的警告减少为一个。 -
我认为这是一个 xcode 错误,请尝试取消注释第二个块并仅使用第一个块运行分析。是的,这可能会导致两种情况下的保留周期。
-
Clang - Blocks retain cycle from naming convention? 的可能重复项 - ARC 编译器确实使用命名约定来决定捕获 self 是“好”还是“坏”。
-
XCode 警告有时是错误的。您是否尝试过清理项目并重新构建?
-
@Guilherme:ARC 编译器使用命名约定来决定是否发出警告。这似乎是一种未记录的启发式方法,我仅通过检查编译器源代码才发现这一点,请参阅我对“可能重复”的回答。这可能会随着新版本的发布而改变。 - 如果你实际上有一个“坏”的保留周期不依赖于方法名称。这取决于保留周期是“临时的”(即最终调用并释放块)还是“永久的”。
标签: ios objective-c objective-c-blocks retain-cycle