зомби событие в какао - PullRequest
       36

зомби событие в какао

0 голосов
/ 04 декабря 2011

У меня ошибка EXC_BAD_ACCESS.Я использовал Профиль в xCode 4, чтобы увидеть, что происходит с памятью, и увидел, что это событие зомби:

An Objective-C message was sent to a deallocated object(zombie) at address ... 

Я нашел упомянутый адрес в Списке объектов.Ответственный абонент -

-[NSWindowTemplate nibInstantiate]

Ответственный зомби - [NSApplication(NSWindowCache) _checkForTerminateAfterLastWindowClosed: saveWindows:]

До события зомби есть - [NSWindow _close], [NSWindow retain] и несколько [NSWindow release] событий (Ref count = 0после последнего [NSWindow release])

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

Почему _checkForTerminateAfterLastWindowClosed запускается, как предотвратить EXC_BAD_ACCESS? Есть идеи?

Спасибо

1 Ответ

2 голосов
/ 05 декабря 2011

Мы можем смело предположить, что _checkForTerminateAfterLastWindowClosed вызывается для проверки того, должно ли приложение завершиться после закрытия последнего окна. Далее мы можем предположить, что он делает это, запрашивая у вашего приложения делегата .

Я только что заметил в ваш предыдущий вопрос , что ваше окно является делегатом вашего приложения. Я предполагаю, что по:

EXC_BAD_ACCESS происходит, когда я закрываю приложение.

Вы имели в виду, что это происходит, когда вы закрываете окно . (Приложение не может быть закрыто; этот глагол не совпадает с этим существительным. Вы закрываете окна и закрываете или закрываете приложения.)

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

Итак, это мертвый объект, о котором сообщается (приборы подтвердят это): Ваше окно, которое также является делегатом вашего приложения.

Лучшее решение - разделить объект на два (или три): создать прямой подкласс NSObject и экземпляр этого в качестве делегата вашего приложения, а также создать и владеть контроллером окна, который загружает окно .

...