【问题标题】:NSInvalidArgument Exception - Random Objects Receiving didEnterBackgroundNSInvalidArgument 异常 - 随机对象接收 didEnterBackground
【发布时间】:2013-09-26 14:56:56
【问题描述】:

每当用户在我的应用处于活动状态时点击主页按钮时,都会出现以下异常。轻微警告 - 下面的示例异常引用 NSCFString。但是,发送此消息并因此导致异常的对象类型是完全随机的。它可以是NSData 或OS_dispatch_queue_specific_queue。

[__NSCFString didEnterBackground:]:无法识别的选择器发送到 instance 0x155344c0 * 由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因:'-[__NSCFString didEnterBackground:]: 无法识别的选择器发送到实例 0x155344c0

每次应用程序退出活动时都会发生这种情况,但接收消息的对象永远不会相同。

我认为这是某种内存问题,但无法追踪它。主要是因为我的代码中没有任何内容直接发送/接收此消息,或者已注册接收UIApplicationWillResignActiveNotification。此外,applicationDidEnterBackground:application 方法在我的 appDelegate 中没有任何内容。

有人见过这种行为吗?如果是这样,调试的最佳方法是什么?或者换一种方式,哪些类型的对象会自动发送didEnterBackground 消息,我显然管理不善?

【问题讨论】:

    标签: ios objective-c memory-management nsexception


    【解决方案1】:

    听起来你有一个僵尸。

    僵尸是一个在释放后被调用的对象。通常,对象的内存地址会被另一个对象使用,因此消息会发送到错误的对象。

    您是否有使用方法 addObserver:selector:name:object: 为“已进入后台”通知 (UIApplicationDidEnterBackgroundNotification) 注册您的应用程序对象之一的代码?该通知是否指定了“didEnterBackground:”的选择器?

    我的猜测是您正在注册 UIApplicationDidEnterBackgroundNotification 通知,然后您指定的 notificationObserver 正在被释放。这将导致您描述的确切行为。

    顺便说一句,您可能希望使用僵尸工具运行您的应用程序,或者打开 NSZombies 环境变量来查找僵尸。然后按下主页按钮导致崩溃,看看 Xcode/instruments 告诉你什么。

    【讨论】:

    • 感谢您的回复。我确实有一个僵尸。但是,它是由第三方库引起的。把我的头撞在墙上一会儿,然后有一个绝妙的主意给开发者发电子邮件。现在一切都好。感谢您的回复。
    • 你好@natenash203,我知道这已经很久了,但你还记得你的第三方库是如何纠正这个问题的吗?似乎我的 lib 正在对一个客户执行此操作,但这确实很少见,我不知道如何重现它。 NSZombies 也没有找到任何东西 ;(
    • 您好..不幸的是,没有。这一切都在幕后。对不起!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 2012-11-28
    • 1970-01-01
    相关资源
    最近更新 更多