Как определить, что объект дважды освобождается с помощью Xcode - сообщения, отправленного на освобожденный экземпляр? - PullRequest
0 голосов
/ 18 августа 2011

Я относительно новичок в Xcode4, и я хотел бы знать, как я могу идентифицировать двойной релиз с ним.

В отладчике я вижу строку типа *** -[NSConcreteMutableData release]: message sent to deallocated instance 0x60b63fe0.

Проблема в том, что знание адреса не очень помогает при идентификации объекта, а также тип объекта не слишком помогает при его идентификации.

Я прочитал http://www.friday.com/bbum/2010/01/10/using-malloc-to-debug-memory-misuse-in-cocoa/, но не нашел это слишком успешным.

Ответы [ 5 ]

6 голосов
/ 18 августа 2011

Вы можете включить переменную среды NSZombieEnabled - см. Как настроить NSZombieEnabled в Xcode 4? для получения инструкций о том, как сделать это в Xcode 4.

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

Инструмент "Zombies" Instruments отлично подходит для обнаружения ошибок этого типа - он фактически включает NZZombieEnabled, и вы можете использовать его, чтобы точно определить, в какой строке кода происходит сбой.

1 голос
/ 18 августа 2011

Вы можете заменить метод релиза, используя категории для целей тестирования, он не предназначен для такой работы как часть языка, но в прошлом я добивался успеха, пытаясь провести некоторое тестирование, обычно все, что вы обнаруживаете, этопул авторелизов освобождает ваш объект.

0 голосов
/ 22 октября 2016

Используйте профилировщик для зомби, чтобы отследить фактический объект.Он автоматически включит NSZombies и, что более важно, сохранит историю всех сообщений о выпуске и авто-выпуске.

  1. Используйте команду меню Profile в разделе Product.
  2. В открывшемся диалоговом окне выбора шаблона профилирования выберите Zombies.
  3. Нажмите кнопку записи на панели инструментов (Command-R), чтобы начать запись.Используйте ваше приложение как обычно.Если вызов сделан для освобожденного объекта, в область временной шкалы вставляется флаг, и появляется диалоговое окно Zombie Messaging.
  4. Щелкните стрелку фокуса рядом с адресом памяти зомби, чтобы отобразить историю памяти объекта зомби.в области сведений вместе с соответствующими ссылками и вызовами методов.

Вот документация Apple с изображениями:

https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/EradicatingZombies.html

0 голосов
/ 18 августа 2011

Попробуйте использовать свойство retainCount.Если объект имеет retainCount == 0, он будет освобожден.В конечном итоге вы не сможете отправить ему сообщение release.

0 голосов
/ 18 августа 2011

Вы отправляете сообщение об освобождении чему-то, что уже выпущено или имеет retainCount 0. Следовательно, оно выдает такое сообщение об ошибке.На самом деле, мой ответ по поводу здесь может помочь.

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