NSApplication init失败:创建多个应用程序

时间:2015-03-30 16:42:38

标签: objective-c xcode cocoa

我正在使用Cocoa中的文档架构,但是会创建自己的窗口而不是笔尖。我正在使用文档体系结构替代适用于而不是的代码的NSApplicationMain。

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

但是在文档架构中,当我创建一个窗口时(我知道这不是创建窗口的方法,但为了简单起见)......

- (void)applicationDidFinishLaunching:(NSNotification *)notification {
    NSWindow *window = [[NSWindow alloc] init];
}

...我收到以下错误。

*** Assertion failure in -[NSApplication init], /SourceCache/AppKit/AppKit-1344.72/AppKit.subproj/NSApplication.m:1787

我已经阅读了关于文档架构的整个指南,尝试在很多地方创建窗口,并仔细考虑了适合架构支持的过程,如下面链接的图像所示。

http://i.stack.imgur.com/RR3nK.png

无论我在何处创建窗口,每当我创建窗口时,我尝试的所有内容都会导致上述错误。一个可能的错误来源是我在appDelegate的OpenUntitledDocumentAndDisplay:error:方法中使用applicationDidFinishLaunching:notification开始文档创建过程,在这种情况下,NSApplication可能会将其视为过早创建文档。

简而言之,为什么在文档体系结构中创建窗口对象会导致NSApplication错误,特别是我正在创建多个应用程序?

1 个答案:

答案 0 :(得分:2)

在没有NSApplicationMain()的情况下查看自己的代码,您不必alloc init NSApplication个实例。

你应该这样做 - 使用sharedApplication单例生成器方法:

NSApplication *application = [NSApplication sharedApplication];

例如,请参阅the answer here。我还谈到了在NSApplicationMain()未使用时会破坏的其他一些事情。

@cacau让我眯着眼睛看着那个断言。它位于应用程序第一行中调用的NSApplication init方法中。如果设置异常断点,它看起来是否会发生异常?

希望有所帮助,但我希望你会遇到更多问题。对于基于文档的应用程序,我还没有完成no-NSApplicationMain的事情。

对于它的价值,sharedApplication引用说:

  

此方法还连接到窗口服务器并完成其他初始化。您的程序应该将此方法作为main()中的第一个语句之一调用;如果您使用Xcode创建应用程序,则会为您完成此调用。