Я новичок в разработке 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
, поскольку кажется, что он работает? Что-нибудь еще?