当[委托]不再被引用时,在`[NSApp run]`中崩溃

时间:2014-01-17 15:09:12

标签: objective-c cocoa appkit

这是代码:

@interface AppDelegate : NSObject <NSApplicationDelegate>

@end

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    printf("My app delegate: finish launching\n");
}

@end

int main(int argc, char *argv[])
{
    @autoreleasepool
    {

        [NSApplication sharedApplication];
        [NSApp setDelegate:[[AppDelegate alloc] init]];
        [NSApp run];
    }
}

它在[NSApp run]中崩溃,但我并没有真正看到我所缺少的东西。如果我在[NSApp finishLaunching]之前添加run,则会在那里崩溃。

如果我没有设置委托,它就不会崩溃。

如果我之前引用该委托,它可以正常工作:

AppDelegate* appDelegate = [[AppDelegate alloc] init];
[NSApp setDelegate:appDelegate];

所以我猜它会因为ARC而在第一个版本中立即释放委托,因为委托可能只是一个弱引用,对吧?但是你应该怎么做相同的代码?

1 个答案:

答案 0 :(得分:5)

是的,你猜对了,NSApplication不保留代表,(弱引用ARC)。 因此,您可以使用-fno-objc-arc使用当前代码构建main.m文件:

int main(int argc, char *argv[])
{
    @autoreleasepool
    {
        [NSApplication sharedApplication];
        [NSApp setDelegate:[[AppDelegate alloc] init]];
        [NSApp finishLaunching];
        [NSApp run];
    }
}
例如,

或在main.m中设置AppDelegate static,并使用ARC

进行构建
static AppDelegate* _appDelegate;

int main(int argc, char *argv[])
{
    @autoreleasepool
    {
        _appDelegate = [[AppDelegate alloc] init];
        [NSApplication sharedApplication];
        [NSApp setDelegate:_appDelegate];
        [NSApp run];
    }
}