Objective-C "сообщение, отправленное освобожденному экземпляру 0x5633b0"

Похоже, что в моем приложении obj-C происходит чрезмерный выпуск - появляется сообщение об ошибке

"- [выпуск myobj]: сообщение отправлено освобожденному экземпляру 0x5633b0"

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

Я подумал, что я мог бы внести некоторые записи в метод инициализации класса, чтобы регистрировать все, что соответствует «0x5633b0», что должно помочь мне отследить, где создается экземпляр.

Что такое «0x5633b0» и есть ли способ получить доступ к этому значению в коде для его регистрации?

Спасибо.

Ответов (7)

Решение

0x5633b0 Вероятно, это адрес рассматриваемого объекта (значение self ). Вы можете использовать NSLog или printf с, %p чтобы распечатать его.

вы также можете добавить их в переменные среды:
MallocStackLoggingNoCompact 1

и напишите в консоли gdb:
info malloc-history <paste-address-here>

Ссылка: здесь

0x5633b0 вероятно, адрес освобожденного объекта (значение myobj ). Вы можете использовать NSLog или printf с, %p чтобы распечатать его.

Вы также можете использовать профилировщик инструментов, чтобы найти освобожденный объект.

1. Запустите профилировщик:

введите описание изображения здесь

2. Выберите «Зомби» и запустите профилировщик.

введите описание изображения здесь

3. Перемещайтесь по симулятору, пока не дойдете до "случая с удаленной ошибкой".

введите описание изображения здесь

Вы не управляете своей памятью должным образом - вы вызываете release / autorelease на какой-то объект больше раз, чем вызываете retain . Убедитесь, что вы следуете всем правилам, изложенным в Руководстве по программированию управления памятью для Какао .

0x5633b0 - это просто адрес ячейки памяти, в которой хранится объект. Вы можете попробовать добавить в init метод код :

- (void) init
{
    if(self == (MyClass*)0x5633b0)
        NSLog(@"Allocated object at address 0x5633b0");  // put a breakpoint on this line
    // do rest of init...
}

Если у вас есть какие-либо другие init методы (например initWithCoder:, который вызывается для объектов, созданных из XIB), обязательно добавьте этот фрагмент в эти методы. Поместите точку останова в NSLog строку и посмотрите, когда она попадет. Обратите внимание, что он может быть выполнен несколько раз, если объект выделен по этому адресу, освобожден, а затем другой объект будет перераспределен по тому же адресу. Последний удар перед аварией - тот, который вам нужен.

В отладчике введите, info symbol 0x5633b0 и вы получите некоторое представление о том, что это за объект. Еще одна полезная вещь - backtrace это трассировка стека. В общем, в этой записи блога есть несколько отличных советов.

Когда я недавно столкнулся с подобными проблемами, лучше всего сработало следующее:

  1. Под под Проект-> Edit Активный Исполняемые -> вкладка Аргументы -> Окружающая среда переменные раздела я добавил и набор для YESследующих переменных: NSAutoreleaseFreedObjectCheckEnabled, NSZombieEnabledи NSDebugEnabled.

  2. В меню «Выполнить» я выбрал Включить Guard Malloc .

С этими настройками отладчик дал больше подсказок о том, что не так с моим кодом.

(Я нашел эти советы здесь )

Удачи, Ори

Рассмотрите возможность использования флага NSZombieEnabled .

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