NSApplicaton делегат - applicationDidFinishLaunching - PullRequest
1 голос
/ 12 апреля 2009

Я объявил делегата для моей заявки на какао здесь:

MyAppDelegate.h

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

MyAppDelegate.m

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

Я связал выход делегата владельца файла с этим объектом в IB.

Тем не менее, этот метод не вызывается. Я не вижу сообщений от него.

Подскажите, пожалуйста, что не так?

1 Ответ

7 голосов
/ 12 апреля 2009

Ваш делегат приложения не является приложением. Он должен наследоваться от NSObject, а не от NSApplication.

Почему это важно

NSApplication является одноэлементным. Его метод init всегда возвращает первый экземпляр NSApplication или любого подкласса, отбрасывая любые последующие объекты, которые вы (или загрузчик nib) можете вызывать init on.

Итак, вы настроили объект приложения в качестве своего собственного делегата. Объект, который вы намеревались сделать делегатом, умер во втором вызове init, и объект приложения занял его место.

Изменение объекта приложения в качестве экземпляра вашего подкласса также сработало бы, но у вас все равно было бы приложение в качестве его собственного делегата, что нечисто и, возможно, опасно (NSApplication может в частном порядке реализовать некоторые из своих методов делегата самостоятельно, так как они просто методы обработки уведомлений). Единственное правильное решение состоит в том, чтобы ваш класс делегата приложения не наследовал от NSApplication.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...