Objective-C "сообщение, отправленное освобожденному экземпляру 0x5633b0"
Похоже, что в моем приложении obj-C происходит чрезмерный выпуск - появляется сообщение об ошибке
"- [выпуск myobj]: сообщение отправлено освобожденному экземпляру 0x5633b0"
. Я знаю класс экземпляра объекта, вызывающего проблему, но этот класс используется повсюду для создания множества экземпляров.
Я подумал, что я мог бы внести некоторые записи в метод инициализации класса, чтобы регистрировать все, что соответствует «0x5633b0», что должно помочь мне отследить, где создается экземпляр.
Что такое «0x5633b0» и есть ли способ получить доступ к этому значению в коде для его регистрации?
Спасибо.
Ответов (7)7
вы также можете добавить их в переменные среды:
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
это трассировка стека. В общем, в этой записи блога есть несколько отличных советов.
Когда я недавно столкнулся с подобными проблемами, лучше всего сработало следующее:
Под под Проект-> Edit Активный Исполняемые -> вкладка Аргументы -> Окружающая среда переменные раздела я добавил и набор для
YES
следующих переменных:NSAutoreleaseFreedObjectCheckEnabled
,NSZombieEnabled
иNSDebugEnabled
.В меню «Выполнить» я выбрал Включить Guard Malloc .
С этими настройками отладчик дал больше подсказок о том, что не так с моим кодом.
(Я нашел эти советы здесь )
Удачи, Ори
Рассмотрите возможность использования флага NSZombieEnabled .
Тогда вы узнаете, что это за освобожденный объект, которым вы отправляете сообщение.