Программно определить, доступен ли объект Какао, загруженный из nib / xib - PullRequest
0 голосов
/ 25 июля 2010

Параметр следующий:

  • У меня есть объект какао в nib-файле, который загружается при загрузке NSWindow и представления
  • Окно может быть закрыто
  • Я также обращаюсь к объекту программно

Теперь, в некоторых ситуациях, происходит сбой, когда я пытаюсь отправить сообщение объекту, но оно было отменено ранее (потому что окно закрыто).Авария выглядит так:

Exception Type:  EXC_BAD_ACCESS (SIGSEGV) 
Exception Codes: KERN_INVALID_ADDRESS at 0x0000000000000017 
Crashed Thread:  0  
Dispatch queue: com.apple.main-thread

Application Specific Information: 
objc_msgSend() selector name: ...

Есть ли способ проверить, доступен объект или нет?Проверка на ноль не работает, это не ноль.Возможно, поток управления не идеален, и я мог бы переписать другие части приложения, чтобы устранить эту проблему, но я думаю, что это более общая проблема, для которой у меня нет решения, и она сводится к следующему:

Как я могу убедиться, что объект, загруженный из пера, имеет значение nil при освобождении?

Ответы [ 2 ]

0 голосов
/ 25 июля 2010

Попробуйте отключить настройку окна «Отпустить при закрытии» в Интерфейсном Разработчике.

0 голосов
/ 25 июля 2010

Полагаю, вы могли бы использовать Interfacebuilder для написания вашего Window-класса, а в методе dealloc вы можете установить VARIABLE на nil. Но вы не можете установить сам объект на ноль. переменная сохраняет указатель на объект, если освобожденный указатель указывает на место в памяти, где может быть что угодно.

Так что, если вы обращаетесь к указанному объекту из другого класса, у вас есть другая переменная, поэтому установка значения в вашем классе Windows на nil не будет полезна вообще.

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

Если вы используете свойство для своего объекта с атрибутом retain, не забудьте вызвать метод установки с self .object = ... без свойства, оно может выглядеть так:

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

<code>
...
- (void)viewDidLoad {
otherClassObject.YOUROBJECT = [self.YOUROBJECT <strong>retain</strong>];</p>

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