NSInvalidArgument异常 - 随机对象接收didEnterBackground

问题描述:

每当用户点击主页按钮,而我的应用程序处于活动状态,我收到以下异常。轻微警告 - 下面的示例例外是NSCFString。但是,发送此消息的对象的类型,从而导致异常是完全随机的。它可以是NSDataOS_dispatch_queue_specific_queueNSInvalidArgument异常 - 随机对象接收didEnterBackground

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

每次发生应用程序被拒绝活动,但收到消息的对象永远不会相同。

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

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

听起来像你有一个僵尸。

僵尸是一个被释放后被调用的对象。通常情况下,对象的内存地址将被用于另一个对象,因此该消息将转到错误的对象。

您是否有代码使用方法addObserver:selector:name:object:?注册您的应用程序对象之一以用于“did enter background”通知(UIApplicationDidEnterBackgroundNotification)?并且该通知是否指定了“didEnterBackground:?”的选择器

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

顺便说一下,你可能想使用僵尸工具运行你的应用程序,或打开NSZombies环境变量来寻找僵尸。然后按主页按钮导致崩溃并查看Xcode /乐器告诉您的内容。

+0

感谢您的回复。我的确有一个僵尸。但是,它是由第三方lib引起的。然后把我的头靠在墙上一会儿,然后有一个绝妙的想法给开发者发邮件。现在都好。感谢您的回应。 – natenash203

+0

你好@ natenash203,我知道这已经很长时间了,但是你还记得你的第三方库如何纠正这个问题吗? 看来我的lib是这样做的一个客户,但它是非常罕见的,我不知道如何重现它。 另外NSZombies没有找到任何东西;( – SeikoTheWiz

+0

你好,不幸的是,不,这一切都在幕后。 – natenash203