Хорошо, вот в чем дело, я ненавижу задавать вопросы о моей отладке и сбоях. Потому что я обычно справляюсь с ними сам, но я просто не могу решить эту проблему, даже после просмотра нескольких вопросов .
Хорошо, вот в чем проблема: мое приложение случайным образом включается и выключается из-за этой трассировки стека:
*** -[ViewController respondsToSelector:]: message sent to deallocated instance 0x1e5d2ef0
Где ViewController
может варьироваться, иногда место, где мой код дает сбой, НЕ имеет отношения к этому конкретному ViewController
и не принадлежит или не называет его.
Кроме того, чтобы получить эту трассировку консоли, я включил Zombies, иначе я бы вообще не получил консольной печати, я бы получил только:, objc_msgSend
что, как я знаю, означает, что я отправляю сообщение о том, что выпущено. Но я не могу найти, где это ... Я действительно застрял! Обычно я всегда отлаживаю свои сбои, поэтому я действительно застрял на этом.
Опять же, это вылетает в разных местах в разное время, включается и выключается. А место падения почти не имеет отношения к ViewController
. И меня это очень сбивает с толку.
Вам нужен мой код? У меня много файлов, и поскольку он дает сбой в разных местах, распространение моего кода будет затруднено!
Я безуспешно пытался добавить символические точки останова, а приложение «Зомби» недоступно в приложении «Инструменты» для iOS. Я не могу запустить свое приложение на симуляторе, так как для него есть неподдерживающая архитектура.
Спасибо всем...
источник
Ответы:
Используйте инструменты для отслеживания ошибок освобожденного экземпляра. Профилируйте свое приложение ( Cmd ⌘+ I) и выберите шаблон Zombies . После того, как ваше приложение запустится, попробуйте его вывести из строя. У вас должно получиться что-то вроде этого:
Щелкните стрелку рядом с адресом во всплывающем окне, чтобы показать объект, который был вызван после того, как он был освобожден.
Теперь вы должны видеть, что каждый вызов, который изменился, сохраняет счетчик этого объекта. Это может быть связано с отправкой напрямую сообщений о сохранении / освобождении, а также с истощением пулов автоматического выпуска или вставкой в NSArrays.
Столбец RefCt показывает значение keepCount после того, как действие было вызвано, а Responsible Caller показывает имя класса и метод, в котором оно было выполнено. Когда вы дважды щелкаете по любому удержанию / освобождению, инструменты покажут вам строку кода, в которой это было выполнено (если это не сработает, вы можете проверить вызов, выбрав его и выбрав его аналог на панели расширенных сведений):
Это позволит вам изучить весь жизненный цикл объекта keepCount и, вероятно, сразу же обнаружить свою проблему. Все, что вам нужно сделать, это найти недостающие остатки для последней версии .
источник
release
. Проблема какая-то неуравновешеннаяrelease
. Я также могу просто быть неудачником в том, наretain
что вы указываете и на что ссылаетесь позже.была аналогичная проблема. В моем случае viewController должен был получать события navigationController, поэтому он регистрировался как делегат контроллера навигации:
Сбой происходит, когда этот контроллер был освобожден, но все еще оставался делегатом для контроллера представления. Добавление этого кода в dealloc не повлияло:
потому что в момент вызова dealloc контроллер представления уже удален из иерархии представлений, поэтому значение self.navigationController равно нулю, поэтому сравнение гарантированно не удастся! :-(
Решением было добавить этот код, чтобы обнаруживать, что виртуальный канал покидает иерархию представления непосредственно перед тем, как это действительно произойдет. Он использует метод, представленный в iOS 5, чтобы определить, когда представление выталкивается, а не отправляется.
Больше никаких сбоев!
источник
Для тех, кто не может ее решить, вот еще несколько приемов:
https://stackoverflow.com/a/12264647/539149
https://stackoverflow.com/a/5698635/539149
https://stackoverflow.com/a/9359792/539149
https://stackoverflow.com/a/15270549/539149
https://stackoverflow.com/a/12098735/539149
Вы можете запускать инструменты в Xcode 5, щелкнув всплывающее окно проекта -> Изменить схему ... Профиль -> Инструмент и выберите Распределения или Утечки, затем профилируйте свое приложение, затем остановите инструменты, нажмите кнопку информации в Распределении и «Включить обнаружение NSZombie» .
Однако для сообщений, поступающих непосредственно из потока com.apple.main, это, вероятно, ничего не покажет.
Я бился об этом более двух часов, и ответ оказался чрезмерным, что я обнаружил, комментируя копию моего проекта грубой силой, пока не нашел виновника:
Проблема в том, что выпуск не устанавливает для переменной значение NULL.
Это означает, что установка для него значения NULL снова вызывает освобождение, уменьшение refcount и немедленное освобождение памяти до тех пор, пока не закончатся с ним переменные, которые ссылаются на viewController.
Так что либо включите ARC, либо убедитесь, что ваш проект постоянно использует release или NULL, но не оба сразу. Я предпочитаю использовать NULL, потому что тогда нет возможности сослаться на зомби, но это затрудняет поиск, где объекты выпускаются.
источник
Вчера я столкнулся с той же проблемой в iOS. Я сделал IAP в подпредставлении «О программе» приложения и добавил Transaction Observer в «О программе» viewDidLoad. Когда я покупаю в первый раз, проблем нет, но после того, как я вернусь в главное окно и снова вхожу в подпредставление для покупки, возникла проблема «сообщение отправлено на освобожденный экземпляр», и приложение разбилось.
После удаления Transaction Observer в dealloc проблема решена.
источник
zombie
объект для покупок в приложении. После многих часов раскопок я нашел вот это ... БОЛЬШОЕ СПАСИБО, чувак.У меня была очень похожая проблема, и я понял, что это связано с набором делегатов контроллера навигации.
Ниже решена моя проблема,
источник
Была такая же проблема в OS X.
Для решения этого недостаточно
- (void)dealloc
метода, как уже сказал @SoftwareEvolved. Но, к сожалению- (void)viewWillDisappear
, доступно только в версии 10.10 и новее.Я представил собственный метод в своем подклассе NSViewController, в котором для всех зомби-опасных ссылок установлено значение nil. В моем случае это были
NSTableView
свойства (delegate
иdataSource
).Вот и все. Каждый раз, когда я собираюсь удалить представление из супервизора, необходимо вызывать этот метод.
источник
У меня была та же проблема. Было трудно найти, какой делегат вызывает проблему, потому что он не указывает ни на одну строку или оператор кода. Поэтому я попробовал каким-то образом, может быть, это станет для вас полезным.
источник