EXC_BAD_INSTRUCTION при синтезе @property (weak) IBOutlet NSWindow * window

Я новичок в разработке ObjC / Cocoa и Mac в целом и играю с основами.

Упрощенный шаблон по умолчанию для нового приложения Какао в Xcode 4.2 на Lion выглядит так:

// AppDelegate.h
#import 

@interface AppDelegate : NSObject 

@property (assign) IBOutlet NSWindow *window;

@end



// Appdelegate.m
#import "AppDelegate.h"

@implementation AppDelegate

@synthesize window = _window;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
}

@end

Я использовал его как основу для различных экспериментов. Читая об автоматическом подсчете ссылок (который используется в проекте) - эта статья , например - я предположил, что можно, возможно, даже следует заменить assign квалификатор для NSWindow * window с weak , но, похоже, это не так.

Приложение работает нормально, но зависает при запуске, с Поток 1: Программа получила сигнал: «EXC_BAD_INSTRUCTION» в AppDelegate.m в строке с @synthesize окном = _window; .

Изменение квалификатора на strong заставляет программу работать, но я не вижу смысла переходить от assign к strong . У меня сложилось впечатление, что пары для не-ARC / ARC назначены / слабые и сохранены / сильные.

Более опытный друг-программист предположил, что даже если квалификатор weak приводит к преждевременному освобождению окна и неудачной попытке доступа к нему, исключение должно быть EXC_BAD_ACCESS , а не EXC_BAD_INSTRUCTION .

Мне здесь явно чего-то не хватает, но я понятия не имею, что именно.

РЕДАКТИРОВАТЬ: После внимательного изучения вывода gdb времени сбоя тот же друг указал мне на эту статью Майка Эша , которая проливает свет на это. По причинам, не понятным мне, NSWindow и некоторые другие классы, которые переопределяют , сохраняют и выпуск , не могут быть целью обнуления слабых ссылок. Интересно, что изменение объявления свойства на это работает:

@property (unsafe_unrehibited) IBOutlet NSWindow * window;

... даже несмотря на то, что unsafe_unrehibited не упоминается в документации Apple для Declared Свойства .

Таким образом, ПЕРЕСМОТРЕННЫЙ ВОПРОС:

Каким будет правильный путь сюда? Придерживаться assign , несмотря на упоминания в Интернете, что его нельзя использовать с ARC? Выбирать strong ? Продолжать использовать unsafe_unrehibited , поскольку кажется, что он работает? Что-нибудь еще?

5
задан JK Laiho 26 October 2011 в 16:56
поделиться