3

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

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

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

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

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

4

1 回答 1

3

听起来你有一个僵尸。

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

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

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

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

于 2013-09-26T15:19:57.787 回答