NSInvalidArgument异常 - 接收didEnterBackground的随机对象

时间:2013-09-26 14:56:57

标签: ios objective-c memory-management nsexception

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

  

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

每次应用程序重新启动时都会发生活动,但接收邮件的对象永远不会相同。

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

有没有人见过这种行为?如果是这样,调试的最佳方法是什么?或者换句话说,什么样的对象会自动发送didEnterBackground消息,显然我管理不善?

1 个答案:

答案 0 :(得分:3)

听起来你有一个僵尸。

僵尸是一个在被解除分配后被调用的对象。通常,对象的内存地址随后用于另一个对象,因此消息将转到错误的对象。

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

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

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