Objective-C "сообщение отправлено освобожденному экземпляру 0x5633b0" - PullRequest
25 голосов
/ 02 марта 2009

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

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

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

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

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

Спасибо.

Ответы [ 7 ]

42 голосов
/ 04 марта 2010

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

  1. В разделе Project-> Edit Active Executable -> вкладка Arguments -> Environment я добавил переменную и установил YES следующие переменные: NSAutoreleaseFreedObjectCheckEnabled, NSZombieEnabled и NSDebugEnabled.

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

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

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

Удачи, Ori

30 голосов
/ 02 марта 2009

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

13 голосов
/ 07 марта 2013

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

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

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

enter image description here

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

enter image description here

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

enter image description here

11 голосов
/ 07 июля 2009

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

0 голосов
/ 24 июня 2013

Рассмотрим , используя флаг NSZombieEnabled .

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

0 голосов
/ 18 ноября 2011

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

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

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

0 голосов
/ 02 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...