2

我正在使用 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

显然它完成了这项工作,并且一旦构建/编译,就不会生成任何警告。

我的问题是,这是一种以这种方式抑制或忽略警告的安全/正常方式吗?

我在一些线程上读到使用子类是有利的,但是有很多人反对以这种方式使用它们......我很感激你的想法:)

4

2 回答 2

5

“我在一些线程上读到使用子类是有利的......”

使用子类可能是有利的,但这不是你在这里做的。

您所做的(SDLApplication) NSApplication. 在该类别中,您正在覆盖NSApplication'sterminate:方法。通常,您应该只使用类别向现有类添加其他方法,而不是覆盖现有方法,因为这可能会产生不可预知的结果。

您真正应该做的是子类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:应该是调用super,以便 terminate 方法正常工作。super(不允许在类别中使用关键字;只有单词self,这就是需要子类化的原因)。

确保您还将文件中NSPrincipalClass键的值更改为而不是.Info.plistSDLApplicationNSApplication

于 2013-01-19T00:37:52.850 回答
3

不。

覆盖(或重新实现)方法,尤其-terminate:是类别中的关键系统方法会导致未定义的行为。显然,退出应用程序不应该是机会游戏。子类 NSApplication 并覆盖-terminate:(最后调用 super),然后在 info.plist 中将其指定为主体类。 Pragmas 不是警告修复者,它们只是抑制器。

于 2013-01-19T00:26:51.487 回答