разработка iPhone - проблема с выпуском памяти - PullRequest
5 голосов
/ 27 января 2009

Я сталкиваюсь с проблемой освобождения уже выпущенного объекта, но не могу на всю жизнь выяснить, где происходит ошибка. Я добавил флаг NSZombieEnabled, и это журнал, который я получаю в GDB. Может кто-нибудь сказать мне, пожалуйста, как решить эту проблему или, скорее, узнать, где произошла ошибка.

*** -[CFString release]: message sent to deallocated instance 0x5e4780 
(gdb) where
#0  0x952ff907 in ___forwarding___ ()
#1  0x952ffa12 in __forwarding_prep_0___ ()
#2  0x9260e20f in NSPopAutoreleasePool ()
#3  0x30a564b0 in _UIApplicationHandleEvent ()
#4  0x31563dea in SendEvent ()
#5  0x3156640c in PurpleEventTimerCallBack ()
#6  0x95280615 in CFRunLoopRunSpecific ()
#7  0x95280cf8 in CFRunLoopRunInMode ()
#8  0x31564600 in GSEventRunModal ()
#9  0x315646c5 in GSEventRun ()
#10 0x30a4ec98 in -[UIApplication _run] ()
#11 0x30a5a094 in UIApplicationMain ()
#12 0x00002494 in main (argc=1, argv=0xbfffef9c) at /Users/adminUser/Projects/MyProject/main.m:14

Спасибо.

1 Ответ

16 голосов
/ 27 января 2009

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

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

NSString* foo = [NSString stringWithFormat:@"foo:%d",42];  
[foo release];  /* this release is bad, as this object is already 
registered for autorelease */

Вы можете использовать следующий метод, чтобы найти точку выделения:

  1. Установить MallocStackLogging, MallocStackLoggingNoCompact окружений равными 1.
  2. Запустите программу и, как только она перейдет в GDB, используйте malloc_history из оболочки, чтобы найти трассировку стека выделения: malloc_history <pid> <addr>. (NSZombieEnabled распечатает адрес в GDB)

Другим вариантом (который с меньшей вероятностью замедлит вашу производительность во время выполнения) является использование инструмента Instruments с шаблоном «Zombies». Он будет отслеживать зомби, а также расскажет вам историю зомби без использования команды malloc_history.

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