有没有办法检查从块引用的局部变量是否被保留?

时间:2012-07-19 05:44:49

标签: objective-c

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

我打算检查本地变量是否被块保留或不使用retainCount,但是失败了。 任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

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


用“执行指针”来思考它(有点像在调试器中单步执行代码时)。

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

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

在块被释放并解除分配之前,它们不会被释放。

答案 1 :(得分:0)

retainCount没用。

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

没有必要验证保留计数,因为它是如何工作的。

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