Я новичок в разработке ObjC / Cocoa и Mac в целом, и увлекаюсь основами.
Упрощенный шаблон по умолчанию для нового приложения Какао в Xcode 4.2 на Lion выглядит следующим образом:
// AppDelegate.h
#import <Cocoa/Cocoa.h>
@interface AppDelegate : NSObject <NSApplicationDelegate>
@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
, но, похоже, это не так.
Приложение работает нормально, но зависает при запуске, с Thread 1: Program received signal: "EXC_BAD_INSTRUCTION"
в AppDelegate.m
на строке с @synthesize window = _window;
.
Изменение квалификатора на strong
заставляет программу работать, но я не понимаю, как имеет смысл перейти с assign
на strong
. У меня сложилось впечатление, что пары для не ARC / ARC назначаются / слабые и сохраняют / сильные.
Более опытный друг-программист предположил, что, даже если квалификатор weak
приводит к преждевременному освобождению window
и неуспешной попытке доступа к нему, исключение должно быть EXC_BAD_ACCESS
, а не EXC_BAD_INSTRUCTION
.
Я, очевидно, что-то здесь упускаю, но понятия не имею, что.
РЕДАКТИРОВАТЬ: После более пристального взгляда на вывод GDB времени сбоя, тот же друг указал мне на эту статью Майка Эша , которая проливает некоторый свет на это. По независящим от меня причинам NSWindow
и некоторые другие классы, которые переопределяют retain
и release
, не могут быть целью обнуления слабых ссылок. Интересно, что изменение объявления свойства на это работает:
@property (unsafe_unretained) IBOutlet NSWindow *window;
... хотя unsafe_unretained
не упоминается в документации Apple по объявленным свойствам .
С этим ПЕРЕСМОТРЕННЫЙ ВОПРОС:
Каким будет правильный путь сюда? Придерживайтесь assign
несмотря на упоминания в Интернете, что его не следует использовать с ARC? Перейти на strong
? Продолжать использовать unsafe_unretained
, так как он, кажется, работает? Что-то еще?