gpt4 book ai didi

objective-c - Objective-C 和 clang 中的循环引用

转载 作者:搜寻专家 更新时间:2023-10-30 20:08:41 25 4
gpt4 key购买 nike

为什么静态分析器检测不到 block 循环引用?我记得当我保留我的代表而不是分配、预先阻止介绍时,它曾经这样做过。我记得它曾经在我的代码上画出漂亮的小线条(我想……)

如果我在不使用 weakSelf 的情况下这样做,我知道我会得到一个循环引用。

// Note 1: myObject is 'retained' by self. 
// Note 2: myObject retains the block for the future

[self.myObject registerBlockOfCodeForFutureExectution:^{
[self doSomething];
}];

Sample Project Exploiting Issue

现在如果我知道这一点,而且我是一个愚蠢的人,那么为什么我的智能计算机不知道这是不好的并警告我我是愚蠢的?

它无法检测到它一定有一个合乎逻辑的原因,我想知道那个原因是什么。

这个问题是关于 clang 和静态分析的,请不要建议我如何修复循环引用——我知道该怎么做。

最佳答案

如果您在 block 内使用 self,它并不自动意味着您获得了保留周期。仅当 block 的生命周期取决于 self 对象的生命周期时,您才会获得保留周期。如果 selfmyObject 有强引用或者一些更复杂的依赖项也是可能的(我假设它确实“保存” block 传递给一个方法,那么可能就是这种情况,所以你在那里已经有了很强的引用)。

因此,要在您的示例中使用保留循环,您需要满足以下两个条件(它们都不符合您发布的代码),并且编译器需要知道它们:1. myObject 的生命周期与 self 相关——让我们假设 self 对它有很强的引用2. saveThisBlockInMyObject: 保留传递给它的 block

我制作了一个小示例,向编译器发出有关捕获 self 的警告 - 以解决第一个问题,我将 myObject 声明为某个类的强属性:

@property (strong) MyTestClass* myObj;
...
self.myObj = [MyTestClass new];

对于第二点,我找不到一种方法来指定该方法保留其参数(返回值有 source annotations,但没有方法参数的相关注释)。但是您将 block 声明为测试类的强属性,然后编译器很乐意警告您可能的保留周期:

typedef void (^MyVoidBlock)();
// MyTestClass
@property (nonatomic, copy) MyVoidBlock voidBlock;

self.voidBlock = ^{
[self doSomething]; // Warning!
};

希望这是有道理的:)

关于objective-c - Objective-C 和 clang 中的循环引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33268682/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com