objective-c - 当委托(delegate)不再被引用时,在 `[NSApp run]` 处崩溃

标签 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]中崩溃,但我并没有真正看到我错过了什么。如果我在 run 之前添加 [NSApp finishLaunching],它就会在那里崩溃。

如果我不设置委托(delegate),它就不会崩溃。

如果我之前引用委托(delegate),它工作正常:

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

所以我猜它会在第一个版本中立即释放委托(delegate),因为 ARC 并且因为委托(delegate)可能只是一个弱引用,对吧?但是,否则你应该如何执行相同的代码呢?

最佳答案

是的,你猜对了,NSApplication不保留委托(delegate)(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 设置为静态,并使用 ARC 进行构建

static AppDelegate* _appDelegate;

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

关于objective-c - 当委托(delegate)不再被引用时,在 `[NSApp run]` 处崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21189168/

相关文章:

iOS Objective-C 等待异步进程

ios - 有没有更好的方法来计算重复间隔通知的小时代码的顶部?

cocoa - 以动态方式摆脱 NewApplication?

objective-c - Cocoa:如何像在 Mail.app 中一样绘制插入文本?

ios - 持久化指向对象的指针

javascript - Parse - Obj-C 到云代码

cocoa - 带 admod 的 Xcode 4.4

objective-c - OS X 上的 3D CAD 图形框架 - 有建议吗?

objective-c - 子类化NSScroller,如何去掉右下角的白色方 block ?

objective-c - 使用 NSRunAlertPanel 时的 EXC_BAD_INSTRUCTION