【问题标题】:NSOperationQueue NSOperation USER_INITIATED crashNSOperationQueue NSOperation USER_INITIATED 崩溃
【发布时间】:2015-06-14 09:04:14
【问题描述】:

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

添加更多信息,这里是Debug Navigator的截图

是不是说发布东西的时候就崩溃了?

更新

我刚刚启用了僵尸对象并获得了以下信息

*** -[AFJSONResponseSerializer release]:消息发送到已释放实例 0x7fdfb378b550

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

我想知道:

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

【问题讨论】:

  • 尝试使用 Zombies 模板在 Instruments 下运行您的应用。它会在您的应用使用已被释放的对象时向您显示,并向您显示该对象的历史记录。
  • 您未能保留或过度释放AFJSONResponseSerializer 的实例。您需要检查保留和释放的历史记录,如 Instruments 中所示,以了解问题所在。添加@autoreleasepool 将无济于事,因为这会释放一些没有它可能会泄露的东西(尽管我不希望这真的发生了)。因此,这将是 under 释放某些东西的可能解决方案。您永远必须使用 ARC 编译,尽管编写代码的方式必须与是否使用 ARC 编译相匹配。 (为 ARC 编写的代码必须使用 ARC 编译。)
  • @KenThomases 非常感谢,我找到了一些关于仪器的教程,但是都太旧了,我也尝试用仪器调试,我点击“记录”时就崩溃了,你知道吗知道在哪里可以找到有关仪器的最新教程,特别是使用 xcode6。
  • 好吧,如果单击记录时 Instruments 崩溃,我认为没有更好的教程会有所帮助。您可能需要重新安装 Xcode,或者您的操作系统安装有问题。 :-/

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


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

静态分析器是你的朋友:也可以使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多