【发布时间】:2015-10-21 20:32:36
【问题描述】:
为什么静态分析器不检测带有块的循环引用?我记得当我保留我的代表而不是分配、预块介绍时,它曾经这样做过。我记得它用来在我的代码上绘制的漂亮的小线条(我认为......)
如果我这样做,不使用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 和静态分析的,请不要建议我如何修复循环引用 - 我知道该怎么做。
【问题讨论】:
-
可能不会创建retain循环,self会保留block吗?看起来不像。
-
“我知道我会得到一个循环引用” - 错误的假设。
-
在这种情况下块是内联的,只有作用域持有块,没有保留循环。一个简单的测试是将 NSLog() 放在类的 dealloc 方法中,并查看当类实例失去它的保留时它会被调用。
-
@zaph 谢谢,但这是理论问题和示例代码,我告诉你它确实创建了一个保留周期。我会让问题更清楚。
-
@zaph 谢谢。我知道如何解决循环引用。问题是关于检测它们的铿锵声 - 而不是我检测它们。如果你看一下我给方法“saveThisBlockInMyObject”的名称,我希望暗示该块被接收者保留。
标签: objective-c circular-reference