Objective c NSApplication初始化失败:创建多个应用程序

Objective c NSApplication初始化失败:创建多个应用程序,objective-c,xcode,cocoa,Objective C,Xcode,Cocoa,我正在Cocoa中使用文档体系结构,但将创建自己的窗口,而不是nib。我正在用适用于不使用文档体系结构的应用程序的代码替换NSApplicationMain int main(int argc, const char * argv[]) { @autoreleasepool { NSApplication *app = [[NSApplication alloc] init]; AppDelegate *appDelegate = [[AppDelegat

我正在Cocoa中使用文档体系结构,但将创建自己的窗口,而不是nib。我正在用适用于不使用文档体系结构的应用程序的代码替换NSApplicationMain

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSApplication *app = [[NSApplication alloc] init];
        AppDelegate *appDelegate = [[AppDelegate alloc] init];
        [app setDelegate:appDelegate];
        [app run];
    }
}
但是对于文档体系结构,当我创建一个窗口时(我知道这不是创建窗口的方法,但为了简单起见)

。。。我收到下面的错误

*** Assertion failure in -[NSApplication init], /SourceCache/AppKit/AppKit-1344.72/AppKit.subproj/NSApplication.m:1787
我已经阅读了关于文档体系结构的整个指南,尝试在许多地方创建窗口,并仔细考虑了该体系结构支持的过程,如下面带有链接的图像所示

无论在何处创建窗口,只要我创建窗口,我尝试的一切都会导致上述错误。一个可能的错误源是,我使用appDelegate的
ApplicationIDFinishLaunching:notification
方法中的
OpenUntitledDocumentAndDisplay:error:
开始文档创建过程,在这种情况下,非应用程序可能会将此视为过早创建文档


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

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

您应该这样做--使用
sharedApplication
singleton生成器方法:

NSApplication *application = [NSApplication sharedApplication];
例如,请参见。我还讨论了当不使用
NSApplicationMain()
时会出现的一些其他问题

@卡考让我对那个断言嗤之以鼻。它位于应用程序第一行调用的
NSApplication init
方法中。如果设置一个异常断点,是否会出现异常

希望这会有所帮助,尽管我希望你会遇到更多的问题。我还没有为基于文档的应用程序做过无应用程序的主要工作

值得一提的是,
sharedApplication
reference说:

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


代码片段似乎与您链接到的png图像不一致——在没有NSWindowController、NSDocument和NSDocumentController的情况下分配一个裸窗口。但你是这么说的。所以我会问,您是否覆盖了NSDocumentController子类上的defaultType?是否覆盖NSDocument子类上的MakeWindowController?如果是,为什么需要显式创建窗口控制器?你应该从MakeWindowController那里得到一个。很难说你没有看到你的代码,但我猜你已经破坏了
nsappapplication
逻辑的其他部分,窗口问题只是一个转移视线的问题。我不认为有理由覆盖defaultType。正确的类型是从info.plist读取的。是的,我覆盖MakeWindowController(但不是在上面的简单示例中),并在该方法中手动创建一个窗口。当我创建窗口时,它会抱怨。我用一个新模板重写了应用程序,但得到了相同的错误。@JosephJohnston-只要加载了plist类型。我知道,如果不使用NSApplicationMain,就会丢失一些plist设置。就像主nib文件,就是这样!非常感谢你。我用非文档应用程序做了正确的sharedApplication,但当我写这篇文章时,我无意中用alloc init创建了这个应用程序。sharedApplication与窗口服务器的连接可能是导致窗口错误的原因。你知道为什么sharedApplication方法有“shared”这个词吗?这只是古老的可可单子命名法。是的,所以没有明显的原因。
NSApplication *application = [NSApplication sharedApplication];