在启用 GC 的目标 C 项目中,我在堆栈上分配一个可变大小的数组,如下所示:
MaValue *myStack = alloca((sizeof(id) * someLength));
(我想这样做的原因并不重要:)然后,在一个循环中,我在 myStack 上/从 myStack 上推送和弹出内容。我压入堆栈的一些东西是没有从其他任何地方引用的新对象。
我的直觉告诉我,目标 C 垃圾收集器不知道这些指针,因此会收集新的(否则未引用的)对象。这种信念的一部分来自这样一种想法,即目标 C GC 并不是真正保守的,而是“知道它的指针”(例如,通过堆栈映射)。
然而,在我所有的实验中(插入 [[NSGarbageCollector defaultCollector] collectExhaustively] 调用)我没有收集到这些对象——这很好,但出乎意料。所以看起来,GC 正在扫描整个堆栈,例如,保守地假设一个恰好具有有效指针值的整数实际上是一个指针。
那是对的吗?还是我错过了什么?