NSOperationQueue NSOperation USER_INITIATED崩溃

时间:2015-06-13 00:59:03

标签: ios objective-c afnetworking-2 nsoperation nsoperationqueue

我在我的应用程序中使用了NSOperation和NSOperationQueue。当遇到EXC_BAD_ACCESS崩溃的警告时,我应该在哪里开始调试?我只是谷歌,并没有找到答案。

enter image description here

添加更多信息,这是Debug Navigator的屏幕截图 enter image description here

这是否意味着它在发布时会崩溃?

更新

我刚启用Zombie Objects并获取以下信息

  

*** - [AFJSONResponseSerializer release]:发送到解除分配的实例0x7fdfb378b550的消息

添加更多信息,我在我的应用程序中没有使用ARC。对于AFNetwork库,我为AFNetwork中的每个* .m文件添加了-fobjc-arc

我想知道:

  1. 根据我之前发现的stackoverflow的一些答案,我没有为每个NSOperation添加@autoreleasepool,我是对的吗?
  2. 我是否还需要为我在我的应用程序中实现的每个* NSOperation.m添加-fobjc-arc
  3. 这是AFNetwork的已知问题吗?

1 个答案:

答案 0 :(得分:1)

如果您将objc_release视为罪魁祸首,那么它会尝试发布以下内容:

  • 已经解除分配
  • 不是[有效]对象

(或者你的筹码到目前为止已被破坏,以至于它正在调用错误的函数,但这并非全部可能)。

首先,展开......并查看它是否显示任何有用的东西(某处有滑块以显示更多细节)。

其次,作为一种风格立场,您可能希望更直接地使用块而不是NSOperation。然后你可以使用

  • - [NSOperationQueue addOperationWithBlock:]
  • dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT),^ {...});

除此之外,您仍然需要调试它。

你在使用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方法)上放置断点并查看它们被调用的位置。然后跟踪该对象以找到您认为它不拥有它的地方,但它仍然在其上调用 - 释放。

静态分析仪在这里是你的朋友:也可以使用它。