Ответ 1
0x5633b0
, вероятно, является адресом рассматриваемого объекта (значение self
). Вы можете использовать NSLog
или printf
с %p
для печати.
Кажется, что в моем приложении obj-C появляется сообщение об ошибке:
"- [myobj release]: сообщение отправлено на освобожденный экземпляр 0x5633b0"
. Я знаю класс экземпляра объекта, вызывающий проблему, но этот класс используется для создания множества экземпляров.
Моя мысль заключается в том, что я могу поместить некоторые записи в метод init класса, чтобы записывать все, что соответствует "0x5633b0", которое должно помочь мне отслеживать, где создается экземпляр.
Что такое "0x5633b0" и есть ли способ получить доступ к этому значению в коде для его регистрации?
Спасибо.
0x5633b0
, вероятно, является адресом рассматриваемого объекта (значение self
). Вы можете использовать NSLog
или printf
с %p
для печати.
Что сработало лучше для меня, когда я столкнулся с подобными проблемами в последнее время, было следующее:
В разделе "Project- > Edit Active Executable → вкладка" Аргументы "- > раздел" Параметры среды "я добавил и установил YES
следующие переменные: NSAutoreleaseFreedObjectCheckEnabled
, NSZombieEnabled
и NSDebugEnabled
.
В меню "Выполнить" я выбрал Enable Guard Malloc.
С этими настройками отладчик предоставил больше намеков на то, что не так с моим кодом.
(я нашел эти советы здесь)
Удачи, Ori
0x5633b0
, вероятно, является адресом освобожденного объекта (значение myobj
). Вы можете использовать NSLog
или printf
с %p
для печати.
Вы также можете использовать профилировщик инструментов, чтобы найти освобожденный объект.
1. Запустите профайлер:
2. Выберите "Зомби" и запустите профайлер.
3. Нажмите через симулятор, пока не нажмете "освобожденный случай ошибки"
В отладчике введите info symbol 0x5633b0
, и вы получите некоторое представление о том, какой он объект. Еще одна полезная вещь - backtrace
, которая даст вам трассировку стека. В целом, эта запись в блоге содержит несколько советов большой.
вы также можете добавить их в переменные среды: MallocStackLoggingNoCompact 1
и напишите в консоли gdb: info malloc-history <paste-address-here>
Ссылка: здесь
Рассмотрим с помощью флага NSZombieEnabled.
Затем вы узнаете, что это за освобожденный объект, который вы отправляете.
Вы не управляете своей памятью правильно - вы вызываете release
/autorelease
на какой-то объект больше раз, чем вы звоните retain
. Убедитесь, что вы выполняете все правила, изложенные в Руководство по программированию управления памятью для Cocoa.
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
, а затем увидите, когда она попадет. Обратите внимание, что он может пострадать несколько раз, если объект выделен по этому адресу, освобожден, а затем другой объект перераспределяется по тому же адресу. Последний удар перед сбоем - это тот, который вы хотите.