我正在使用Xcode 4.5。 在我最新的Xcode项目中,当我构建/编译我的程序时,我会弹出这个警告:
Category is implementing a method which will also be implemented by its primary class
这是导致错误的代码:
@implementation NSApplication (SDLApplication)
- (void)terminate:(id)sender {
SDL_Event event;
event.type = SDL_QUIT;
SDL_PushEvent(&event); }
@end
我已经这样做了,所以编译器使用pragma code
忽略(或跳过)警告生成。
所以我的代码现在看起来像这样:
@implementation NSApplication (SDLApplication)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
- (void)terminate:(id)sender{
SDL_Event event;
event.type = SDL_QUIT;
SDL_PushEvent(&event);}
#pragma clang diagnostic pop
@end
显然它完成了这项工作,一旦构建/编译,就不会产生任何警告。
我的问题是,这是以这种方式抑制或忽略警告的安全/可靠方法吗?
我在一些线程上读到使用子类是有利的,但是有很多人提出并反对以这种方式使用它们...我很感激你的想法:)
答案 0 :(得分:5)
“我在一些线程上读到使用子类是有利的......”
使用子类可能是有利的,但这不是你在这里做的。
您所做的是在(SDLApplication)
上实施了NSApplication
Objective-C Category。在该类别中,您将覆盖NSApplication
的{{1}}方法。通常,您应该仅使用类别向现有类添加其他方法,而不是覆盖现有方法,因为这可能会产生不可预测的结果。
你真正应该做的是子类terminate:
,以便你可以正确覆盖NSApplication
:
terminate:
重写@interface SDLApplication : NSApplication {
}
@end
@implementation
- (void)terminate:(id)sender {
SDL_Event event;
event.type = SDL_QUIT;
SDL_PushEvent(&event);
[super terminate:sender]; // this line is the key to assuring proper behavior
}
@end
方法的最后一步应该是调用terminate:
,以便terminate方法可以正常工作。 (不允许在类别中使用关键字super
;只允许使用单词super
,这就是需要进行子类化的原因。
请务必同时将self
文件中的NSPrincipalClass
键的值更改为Info.plist
,而不是SDLApplication
。
答案 1 :(得分:3)
覆盖(或重新实现)方法,尤其是类别中的-terminate:
等关键系统方法会导致未定义的行为。显然,退出应用程序不应该是机会游戏。子类NSApplication并覆盖-terminate:
(最后调用super),然后在info.plist中将其指定为Principal Class。 Pragma
不是警告固定器,它们只是抑制器。