Исключение NSInvalidArgument — получение случайных объектов didEnterBackground

Каждый раз, когда пользователь нажимает кнопку «Домой», пока мое приложение активно, я получаю следующее исключение. Небольшое предостережение. Пример исключения ниже ссылается на NSCFString. Однако тип объекта, который получает это сообщение и, таким образом, вызывает исключение, является абсолютно случайным. Это может быть NSData или OS_dispatch_queue_specific_queue.

[__NSCFString didEnterBackground:]: нераспознанный селектор отправлен в экземпляр 0x155344c0 * Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «-[__NSCFString didEnterBackground:]: нераспознанный селектор отправлен в экземпляр 0x155344c0

Происходит каждый раз, когда приложение становится активным, но объект, получающий сообщение, никогда не бывает одинаковым.

Я предполагаю, что это какая-то проблема с памятью, но у меня возникли проблемы с ее отслеживанием. В основном потому, что ничто в моем коде никогда напрямую не отправляет/не получает это сообщение и не зарегистрировано для получения UIApplicationWillResignActiveNotification. Кроме того, в моем appDelegate нет ничего для метода applicationDidEnterBackground:application.

Кто-нибудь когда-нибудь видел такое поведение? И если да, то как лучше отладить? Или, может быть, по-другому, каким объектам будет автоматически отправлено сообщение didEnterBackground, с которым я явно плохо справляюсь?


person natenash203    schedule 26.09.2013    source источник


Ответы (1)


Похоже, у вас есть зомби.

Зомби — это объект, который вызывается после его освобождения. Часто адрес памяти объекта затем используется для другого объекта, поэтому сообщение направляется не тому объекту.

У вас есть код, который регистрирует один из ваших объектов приложения для уведомления «вошел в фоновый режим» (UIApplicationDidEnterBackgroundNotification) с использованием метода addObserver:selector:name:object:? И указывает ли это уведомление селектор «didEnterBackground:?»

Я предполагаю, что вы регистрируетесь для получения уведомлений UIApplicationDidEnterBackgroundNotification, а затем указанное вами уведомление Observer освобождается. Это вызовет точное поведение, которое вы описываете.

Кстати, вы можете запустить свое приложение, используя инструмент зомби, или включить переменную среды NSZombies для поиска зомби. Затем нажмите кнопку «Домой», чтобы вызвать сбой, и посмотрите, что вам скажет Xcode/instruments.

person Duncan C    schedule 26.09.2013
comment
Спасибо за ответ. У меня действительно был зомби. Однако это было вызвано сторонней библиотекой. Некоторое время билась головой о стену, а потом пришла в голову блестящая идея написать разработчику по электронной почте. Теперь все хорошо. Спасибо за ответ. - person natenash203; 08.10.2013
comment
Здравствуйте @natenash203, я знаю, что это было давно, но вы помните, как ваша сторонняя библиотека исправила эту проблему? Кажется, моя либа делает это с одним клиентом, но это действительно редко, и я понятия не имею, как это воспроизвести. Также NSZombies ничего не нашли ;( - person SeikoTheWiz; 01.04.2016
comment
Привет.. к сожалению, нет. Все это было немного за кадром. Извиняюсь! - person natenash203; 04.04.2016