我正在编写一个利用垃圾收集器的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 。在之后从中删除。。
为什么会这样?
答案 0 :(得分:1)
关于内部指针的Garbage Collection Programming Guide部分似乎是这种现象的最接近的文档,但它似乎不太合适。尝试验证您的应用实际上是使用垃圾收集而不是手动引用计数。如果真的启用了垃圾收集器,那么它似乎有一个错误或记录不足的功能。
答案 1 :(得分:1)
您是否确认垃圾收集真的开启?你可以尝试在你的课程中加入-dealloc方法,看看你是否曾经打过它。它永远不会打开GC。根据Apple文档,GC不应该收集堆栈变量指向的对象,所以你看到的不应该发生。