我在我的应用程序中使用了NSOperation和NSOperationQueue。当遇到EXC_BAD_ACCESS崩溃的警告时,我应该在哪里开始调试?我只是谷歌,并没有找到答案。
添加更多信息,这是Debug Navigator的屏幕截图
这是否意味着它在发布时会崩溃?
我刚启用Zombie Objects并获取以下信息
*** - [AFJSONResponseSerializer release]:发送到解除分配的实例0x7fdfb378b550的消息
添加更多信息,我在我的应用程序中没有使用ARC。对于AFNetwork库,我为AFNetwork中的每个* .m文件添加了-fobjc-arc
。
我想知道:
-fobjc-arc
? 答案 0 :(得分:1)
如果您将objc_release视为罪魁祸首,那么它会尝试发布以下内容:
(或者你的筹码到目前为止已被破坏,以至于它正在调用错误的函数,但这并非全部可能)。
首先,展开......并查看它是否显示任何有用的东西(某处有滑块以显示更多细节)。
其次,作为一种风格立场,您可能希望更直接地使用块而不是NSOperation。然后你可以使用
除此之外,您仍然需要调试它。
你在使用ARC吗?如果是这样,这几乎肯定与其中一条线相关:
// This keeps an unretained Objective-C pointer. Later, if you
// try to use it, it may retain it and release it.
__unsafe_unretained id object = someObjectiveCObject ;
// This bridges the object, but doesn't retain it. If you
// bridge it back later, it'll try to release it at the end,
// but you never owned it.
CFTypeRef object = (__bridge CFTypeRef) someObjectiveCObject ;
id later = (__bridge_transfer id) object ;
// This uses an uninitialized pointer
CFTypeRef object ;
dispatch_async ( dispatch_get_main_queue() , ^{
id object = (__bridge_transfer id) object ;
} ) ;
如果没有,为什么不是你呢?在这种情况下,您必须搜索代码以找到您未保留的内容。
我强烈建议运行Xcode的静态分析器并仔细查看它突出显示的每个事件 - 它非常擅长发现这些问题,因为它知道所有权及其转移
更新
由于您不使用ARC,因此可能更难找到,因为现在可能存在的问题可能会更大。希望没有很多课程被分配。
我建议修改该类的代码添加以下内容:
- (id) retain {
return [super retain] ;
}
- (void) release {
[super release] ;
}
然后在那些(以及它们的初始化器和dealloc方法)上放置断点并查看它们被调用的位置。然后跟踪该对象以找到您认为它不拥有它的地方,但它仍然在其上调用 - 释放。
静态分析仪在这里是你的朋友:也可以使用它。