Как отладить "message sent to deallocated instance" в Xcode4?

я нажал ALT+CMD+R и активировал NSZombieEnabled в Arguments > Environment Variables. Кроме того, я активировал его в Diagnostics > Memory Management > Enable Zombie Objects.

Однако, когда я собрал и запустил приложение, в какой-то момент оно аварийно завершается, выдавая в консоль вот такое бесполезное сообщение:

*** -[CALayer retainCount]: message sent to deallocated instance 0x656b260

Трассировка стека так же бесполезна. Я передвинул ползунок уровня детализации до упора вправо. Поток 1 просто показывает мне следующее:

screenshot

Все принадлежит системе, и нет ни одной строки, связанной с моим приложением. Так что, очевидно, NSZombiesEnabled не работает, как это было в Xcode 3, где он останавливался на мертвом объекте.

Есть ли способ выяснить, какой CALayer деаллоцируется слишком рано?

Обновление: Итак, после сборки и запуска еще около 100 раз проблема внезапно РАЗРЕШИЛАСЬ! Она полностью исчезла! И что самое интересное: Я никак не изменял свой код! Между этим я несколько раз очищал папку сборки и проект командами clean и несколько раз удалял приложение в симуляторе.

Обновление 2: К счастью, проблема снова появилась. И теперь она кажется постоянной. К счастью, потому что я предпочитаю найти первопричину, а не раздражать пользователей случайным образом.

Обновление 3: Наконец-то случайно нашел:

startButton = newBttn;

должно было быть:

self.startButton = newBttn;

startButton был сохраняемым свойством, и в -dealloc я его освободил. Таким образом, она была освобождена слишком сильно, и в большинстве случаев (но не во всех) после затухания представления она падала, выдавая странное сообщение CALayer retainCount.

Zombies Instrument (CMD + I) наконец-то указал, что это связано с кнопкой. Только не было понятно, почему и где.

Статический анализатор Clang не пожаловался на этот очевидный глюк.

49
задан dontWatchMyProfile 28 November 2011 в 12:58
поделиться