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

Кажется, что в моем приложении obj-C появляется сообщение об ошибке:

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

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

Моя мысль заключается в том, что я могу поместить некоторые записи в метод init класса, чтобы записывать все, что соответствует "0x5633b0", которое должно помочь мне отслеживать, где создается экземпляр.

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

Спасибо.

Ответ 1

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

Ответ 2

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

  • В разделе "Project- > Edit Active Executable → вкладка" Аргументы "- > раздел" Параметры среды "я добавил и установил YES следующие переменные: NSAutoreleaseFreedObjectCheckEnabled, NSZombieEnabled и NSDebugEnabled.

  • В меню "Выполнить" я выбрал Enable Guard Malloc.

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

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

Удачи, Ori

Ответ 3

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

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

1. Запустите профайлер:

enter image description here

2. Выберите "Зомби" и запустите профайлер.

enter image description here

3. Нажмите через симулятор, пока не нажмете "освобожденный случай ошибки"

enter image description here

Ответ 4

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

Ответ 5

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

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

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

Ответ 7

Вы не управляете своей памятью правильно - вы вызываете 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, а затем увидите, когда она попадет. Обратите внимание, что он может пострадать несколько раз, если объект выделен по этому адресу, освобожден, а затем другой объект перераспределяется по тому же адресу. Последний удар перед сбоем - это тот, который вы хотите.