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) Objective-C カテゴリを に実装したことNSApplicationです。そのカテゴリでは、NSApplicationterminate:メソッドをオーバーライドしています。一般に、カテゴリは、既存のメソッドをオーバーライドするのではなく、既存のクラスに追加のメソッドを追加する場合にのみ使用してください。予測できない結果が生じる可能性があるためです。

本当にすべきことは、適切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 に答える