Полезны ли зомби в Objective-C ++? - PullRequest
1 голос
/ 12 сентября 2011

Я отлаживаю EXC_BAD_ACCESS в Objective-C ++ и, как хороший SO студент, я установил переменную окружения NSZombieEnabled в YES.

Я не получаю никаких зомби, просто (gdb) в журнале, а затем EXC_BAD_ACCESS в различных (C ++) строках моего кода.

Вопрос: Я неправильно использую Зомби, или они просто игнорируют части C ++ моего проекта?

Пример:

if (this->squares[i][j] == 1) // <-- EXC_BAD_ACCESS on this line. The array exists and shows up in the debugger... and i and j both exist and are 0.

Stack:

Thread 1, Queue : com.apple.main-thread
#0  0x00009309 in Board::draw(float, float, float, float, float) at /Developer/of_007_iphone/apps/cwi007/iTicTacToe/src/gameplay/gameBoard.cpp:53
#1  0x0000a2f1 in SuperBoard::drawBig(float, float, float) ()
#2  0x000044b8 in testApp::draw() ()
#3  0x0020fc16 in ofAppiPhoneWindow::timerLoop() ()
#4  0x00218db9 in -[ofxiPhoneAppDelegate timerLoop] ()
#5  0x00ab1749 in __NSFireTimer ()
#6  0x01f898c3 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ ()
#7  0x01f8ae74 in __CFRunLoopDoTimer ()
#8  0x01ee72c9 in __CFRunLoopRun ()
#9  0x01ee6840 in CFRunLoopRunSpecific ()
#10 0x01ee6761 in CFRunLoopRunInMode ()
#11 0x027651c4 in GSEventRunModal ()
#12 0x02765289 in GSEventRun ()
#13 0x00d29c93 in UIApplicationMain ()
#14 0x002106e1 in ofAppiPhoneWindow::runAppViaInfiniteLoop(ofBaseApp*) ()
#15 0x002219ae in ofRunApp(ofBaseApp*) ()
#16 0x00002fd6 in main ()

Ответы [ 2 ]

1 голос
/ 09 ноября 2011

Зомби очень полезны, потому что они будут отмечаться в отладчике, когда вы отправляете сообщение объекту, который был освобожден.Однако они работают только с кодом Objective-C.

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

Это потому, что среда выполнения Objective-C будет освобождать освобожденные объекты только тогда, когда все объекты, которые находятся в определенном фрагменте памяти, былиосвобождены и имеют право на освобождение.

См. здесь большое объяснение и инструкции о том, как отследить эти надоедливые ошибки:

Понимание Лу Франко EXC_BAD_ACCESS

0 голосов
/ 15 мая 2012

Я буду утверждать "нет", потому что способ реализации NSZombieEnabled несовместим с -fobjc-call-cxx-cdtors. Это означает, что переменные экземпляра с десконструкторами неправильно деконструируются, когда объект переходит из «живого» в «зомби». В моем случае (только сейчас) я получил сообщение от кого-то, что мой проект прервался в NSZombie при отладке с помощью этой техники, и, глядя на проблему, я отследил ее до интеллектуального указателя, который автоматически очищал делегатов на зависимые объекты не разрушаются во время выполнения.

http://www.cocoabuilder.com/archive/cocoa/226062-instance-variables-not-destructed-if-nszombieenabled.html

...