Xcode - 实现一个方法,也可以由它的主类实现

时间:2013-01-18 23:48:36

标签: objective-c pragma

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

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

我的问题是,这是以这种方式抑制或忽略警告的安全/可靠方法吗?

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

2 个答案:

答案 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不是警告固定器,它们只是抑制器。