NSApplicaton委托 - applicationDidFinishLaunching

时间:2009-04-12 04:24:56

标签: objective-c cocoa macos

我在这里为我的cocoa应用程序声明了一个委托:

MyAppDelegate.h

@interface MyAppDelegate : NSApplication {
}
- (void) applicationDidFinishLaunching:(NSNotification*) notice ;
@end

MyAppDelegate.m

@implementation MyAppDelegate 
- (void) applicationDidFinishLaunching:(NSNotification*) notice {
    NSLog(@"inside appdidfinishlaunching") ;
}
@end

我已将文件所有者的委托出口链接到IB中的此对象。

然而,这种方法没有被调用。我没有看到任何日志消息。

你能告诉我哪里出错了吗?

1 个答案:

答案 0 :(得分:7)

您的应用程序委托本身不是应用程序。它应该继承自NSObject,而不是NSApplication。

为何重要

NSApplication是一个单身人士。它的init方法总是返回NSApplication的第一个实例或任何子类,抛弃你(或者nib加载器)可能正在调用init的任何后续对象。

因此,您最终将应用程序对象设置为自己的委托。您打算委托的对象在第二次调用init时死亡,应用程序对象取而代之。

将应用程序对象更改为子类的实例也会有效,但是您仍然将应用程序作为自己的委托,这是不洁净且可能存在危险(NSApplication可能会私下实现其某些委托方法本身,因为它们只是通知处理程序方法)。唯一正确的解决方案是让您的app delegate类不从NSApplication继承。