2

苹果文档说“在手动引用计数的环境中,复制块时保留块内使用的局部变量。在块内使用实例变量将导致对象本身被保留。”

我打算检查局部变量是按块保留还是不使用retainCount,但失败了。谁能帮我?

4

2 回答 2

1

除非复制块,否则块不会保留对象。由于块只能捕获与捕获状态相同的范围内的状态,因此实现假定不需​​要实际保留任何内容,除非为了逃避声明范围而复制块。


从“执行指针”的角度来考虑它(有点像在调试器中单步执行代码时)。

当执行指针越过块的声明时,该块将捕获快照——复制——在块范围内使用但未在块本身内声明的所有变量。对于一个对象,这意味着该块复制对object 的引用,而不是对象本身的副本。

一个块从堆栈开始。当第一次复制一个块时,它会使用编译器生成的每块“复制助手”从堆栈复制到堆中(一个简单的块可能没有复制助手,实际上可能永远不会在堆栈上)。该复制助手将保留块引用的任何对象(无论如何都没有通过__block变量引用)。

在块被释放和释放之前,它们不会被释放。

于 2012-07-19T16:29:59.703 回答
0

retainCount没用。

相信实施的文档。如果由于某种原因失败或违背您的期望,请提供一个示例程序。

无需验证保留计数,因为它就是这样工作的。

如果您确实对此表示怀疑并想对其进行完整性检查,则可以将 Instruments 配置为记录NSObjects 的引用计数操作。在这种情况下,像往常一样运行(当然是从 Instruments 启动),在分配的对象列表中找到感兴趣的实例,然后评估感兴趣对象的 ref-count-ops 的回溯。你应该在那里看到它。

于 2012-07-19T05:56:20.043 回答