ios - xcode 保留周期警告仅有时发生

标签 ios objective-c xcode automatic-ref-counting objective-c-blocks

Xcode 似乎只是有时会发出警告“在此 block 中强烈捕获‘ self ’可能会导致保留周期”,如下面的代码片段所示。

enter image description here

第一个 block 实际上对于保留循环是安全的吗?如果是,为什么?或者它是否不安全并且 xcode 不正确地给出警告?

最佳答案

这两个 block 都会导致一个保留周期。只是第一个更难检测到它,所以编译器不会报告它。

在您的第一个 block 中,我假设 datePicker 是您的对象的属性。所以你的对象保留了日期选择器,它保留了保留你的对象的 block (通过捕获 self )。这是一个包含 3 个对象的循环,但仍然是一个循环。

在你的第二个 block 中,这要简单得多:你的对象保留 block , block 保留你的对象(通过捕获 self )。这是一个只有 2 个易于识别的对象的循环(因此警告)。

在这两种情况下,您都应该弱捕获 self 以避免保留周期。

__weak typeof(self) weakSelf = self;
[self methodThatRetainsABlock: ^{
    typeof(weakSelf) strongSelf = weakSelf;
    if (strongSelf == nil) {
        return;
    }
    // Don't ever use self here, as it will capture it strongly.
    // Use only strongSelf
}];

关于ios - xcode 保留周期警告仅有时发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42736496/

相关文章:

ios - 应用程序因 NSInvalidArgumentException 而崩溃

objective-c - 是否有用于与 SOAP Web 服务通信的 native iOS 解决方案?

objective-c - ASIHTTPRequest 在中断 Internet 连接后导致崩溃

ios - SwiftLint - 禁用特定文件中的行长规则

objective-c - 调整 View 中 subview 的大小

ios - 为什么我会收到此错误 : Result values in '? :' expression have mismatching types '[String]?' and 'String'

xcode - 在 xcode 中找不到 <Growl/Growl.h> 文件

ios - 为什么我在 swift 混合项目成功运行时收到警告?

ios - UITextField 数字键盘 : dot instead of comma for float values

ios - 如何在函数声明中将返回类型移动到 AppCode 中的下一行?