为什么Obj-C GC清除我的参考?

时间:2009-01-29 05:39:22

标签: objective-c garbage-collection

我正在编写一个利用垃圾收集器的Objective-C程序。

我在某些情况下得到 EXC_BAD_ACCESS ,一个对象被“过度释放”的经典例子。使用一些调试技巧in this technote,即 MallocScribble AUTO_LOG_COLLECTIONS ,我可以看到我的对象正在从我身下出来。

话虽如此,这是我的代码。

我有一个NSMutableDictionary,它包含对象的 ONLY 引用。在一种方法中,我正在做:

NSObject *object = [dictionary objectForKey:key];

NSLog(@"Object is %@", object);
[dictionary removeObjectForKey:key];

如果我在 NSLog语句之前从字典中删除该对象,如果GC在正确的时刻运行,我会得到 EXC_BAD_ACCESS 。在之后从中删除。

为什么会这样?

2 个答案:

答案 0 :(得分:1)

关于内部指针的Garbage Collection Programming Guide部分似乎是这种现象的最接近的文档,但它似乎不太合适。尝试验证您的应用实际上是使用垃圾收集而不是手动引用计数。如果真的启用了垃圾收集器,那么它似乎有一个错误或记录不足的功能。

答案 1 :(得分:1)

您是否确认垃圾收集真的开启?你可以尝试在你的课程中加入-dealloc方法,看看你是否曾经打过它。它永远不会打开GC。根据Apple文档,GC不应该收集堆栈变量指向的对象,所以你看到的不应该发生。