苹果文档说“在手动引用计数的环境中,复制块时保留块内使用的局部变量。在块内使用实例变量将导致对象本身被保留。”
我打算检查局部变量是按块保留还是不使用retainCount,但失败了。谁能帮我?
苹果文档说“在手动引用计数的环境中,复制块时保留块内使用的局部变量。在块内使用实例变量将导致对象本身被保留。”
我打算检查局部变量是按块保留还是不使用retainCount,但失败了。谁能帮我?
除非复制块,否则块不会保留对象。由于块只能捕获与捕获状态相同的范围内的状态,因此实现假定不需要实际保留任何内容,除非为了逃避声明范围而复制块。
从“执行指针”的角度来考虑它(有点像在调试器中单步执行代码时)。
当执行指针越过块的声明时,该块将捕获快照——复制——在块范围内使用但未在块本身内声明的所有变量。对于一个对象,这意味着该块复制对object 的引用,而不是对象本身的副本。
一个块从堆栈开始。当第一次复制一个块时,它会使用编译器生成的每块“复制助手”从堆栈复制到堆中(一个简单的块可能没有复制助手,实际上可能永远不会在堆栈上)。该复制助手将保留块引用的任何对象(无论如何都没有通过__block
变量引用)。
在块被释放和释放之前,它们不会被释放。
retainCount
没用。
相信实施的文档。如果由于某种原因失败或违背您的期望,请提供一个示例程序。
无需验证保留计数,因为它就是这样工作的。
如果您确实对此表示怀疑并想对其进行完整性检查,则可以将 Instruments 配置为记录NSObject
s 的引用计数操作。在这种情况下,像往常一样运行(当然是从 Instruments 启动),在分配的对象列表中找到感兴趣的实例,然后评估感兴趣对象的 ref-count-ops 的回溯。你应该在那里看到它。