Непредсказуемый EXC_BAD_ACCESS и objc_msgSend_vtable5 - PullRequest
1 голос
/ 18 сентября 2010

Я тестировал свое приложение, и вдруг у него было EXC_BAD_ACCESS.Теперь это стало нерегулярным явлением, происходящим на некоторых сборках, а не на других.Он также выдает множество ошибок в отладчике, таких как objc_msgSend_vtable5 Что может вызвать такую ​​странную проблему, как эта?

Ответы [ 2 ]

1 голос
/ 05 октября 2010

У меня недавно была такая же ошибка.Краткая версия: это произошло потому, что у меня был объект, у которого был освобожден делегат.Убедитесь, что у вас есть контроль над жизненным циклом любых назначаемых вами делегатов, будь то через Интерфейсный Разработчик или иным образом.

Длинная версия: ошибка возникает, когда среда выполнения Objective C пытается отправить сообщение объектуэто было в конечном счете выпущено и освобождено.Это отличается от отправки сообщения нулевому объекту (совершенно допустимая операция Objective-C).В этих случаях среда выполнения знает , что объект равен нулю, и отвечает соответствующим образом.Скорее, в этом случае Objective-C думает, что имеет реальный, действительный объект для связи, и отправляет сообщение по адресу, который не содержит объекта.

В моем случае у меня был объект типа NSTextView, которыйбыл связан с делегатом Интерфейсным Разработчиком.Когда контроллер представления или представления создается с файлом NIB / XIB, Какао подключает все дочерние представления в соответствии с инструкциями, включая подключение любых делегатов, которые могут у вас быть.

Моя ошибка состояла в том, что я создал подклассNSView, сделал его NSTextViewDelegate и затем сказал Интерфейсному Разработчику подключить дочерний NSTextView к этому родительскому представлению.Однако во время различных операций, которые я выполнял на собственном NSViewController, я сказал Какао удалить NSView из иерархии представлений и повторно вставить его позже.

AppKit в частности говорит вам не сохранятьлюбые IBOutlets, которые вы можете иметь в своих классах, но лучше отслеживать их с помощью простого задания.Это потому, что AppKit обрабатывает управление памятью для вас.Мало ли я знал, что, попросив представление на некоторое время покинуть иерархию представлений, я запустил AppKit, чтобы очистить этот NSView.Так как только AppKit имел какие-либо удержания на самом объекте представления, [pfft] , он ушел в эфир.Deallocated.

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

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

1 голос
/ 18 сентября 2010

Похоже, это была моя вина.Чтобы все исправить, мне нужно было позвонить retain.

...