12

Objective-Cプロトコルの単一のメソッドを非推奨にする必要があります。__attribute__ ((deprecated));通常のクラス/インスタンスメソッドでは、宣言後に追加します。

プロトコルメソッドでは動作しないようです。私がそれらを非推奨とマークし、プロジェクトが正常にコンパイルされる場所でそれらを使用すると、予期された非推奨の警告なしに。

それはAppleLLVM3.1の欠陥ですか、それとも私は何か間違ったことをしていますか?

4

3 に答える 3

7

ここでの回答はいくつかの非常に良い情報を提供しますが、それらは時代遅れです。Xcode5.0およびLLVM5.0以降、Objective-Cプロトコルメソッドの非推奨の警告が認識されているようです。メソッドを実装するとき、Xcode5はそれにフラグを立てます。

警告:非推奨のメソッドを実装しています

非推奨のプロトコルメソッドを実装するための非推奨の警告を生成するために使用した手順は次のとおりです。

  1. を使用して、プロトコルメソッドを非推奨としてマークします__deprecated。新しいSDK7.0ドキュメントから:

    __deprecated causes非推奨の機能を使用するコードに遭遇したときに警告を生成するコンパイラ。__deprecated_msg()同じことを行い、それをサポートするコンパイラは、非推奨の警告とともにメッセージを出力します。-Wdeprecatedこれには、フラグを使用してそのような警告をオンにする必要がある場合があります。__deprecated_enum_msg()列挙型で使用する必要があり、それをサポートするコンパイラは非推奨の警告を出力します。

    #define __deprecated    __attribute__((deprecated))
    

    メソッドを廃止するには、次のようにします。

    - (void)aDeprecatedProtocolMethod __deprecated;
    

    Xcodeが非推奨の警告を表示するには、これだけ十分です。ただし、警告が表示されるようにするには、次のいくつかの手順(Xcodeが非常に扱いにくい場合があることを認識している)に従う必要があります。

  2. 非推奨の警告タグを含むドキュメントコメントを追加します。方法については、以下のコード例を参照してください。

    /** Describe the method here - what does it do, how does it work, etc. Very brief.
        @deprecated This delegate method is deprecated starting in version 2.0, please use otherMethodNameHere:withAnExtraParameter: instead. */
    - (void)aDeprecatedProtocolMethod __deprecated;
    
  3. プロジェクトをクリーンアップします(⌘</kbd>+⇧</kbd>+K) and then Build the project (⌘</kbd>+B) - just because Xcode can be funky sometimes.

この機能がいつどこで導入されたか(SDK 7.0と10.9、Xcode 5.0 / 5.0.1、またはLLVM 5.0で)は100%わかりませんが、それでも機能します。

于 2014-01-20T23:31:57.453 に答える
4

さて、私はちょうどAppleでさえ__attribute__((deprecated))最後に使用することに気づきました。そして、それも機能しません。非推奨のデリゲートメソッドを使用する場合、たとえば

- (UITableViewCellAccessoryType)tableView:(UITableView *)tableView
     accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath

警告はありません。

ですから、レーダーの候補のようです。

編集:レーダーを提出、バグID#11849771。

于 2012-07-11T15:18:09.147 に答える
3

AppleはUITableViewDelegateプロトコルの一部のメソッドを非推奨にしました。おそらく、Appleのコードを例として使用して解決策を見つけることができるでしょう。

プロトコルの関連コードは次のとおりです。

- (UITableViewCellAccessoryType)tableView:(UITableView *)tableView
         accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath
 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_NA,__MAC_NA,__IPHONE_2_0,__IPHONE_3_0);

ご覧のとおり、Appleはマクロを使用しています。おそらくこれが進むべき道ですか?

編集:次のリンクに記載されているように[1]__attribute__((deprecated))はGCC構造であるため、LLVMでは機能しない可能性があります。これがAppleがマクロを使用する理由だと思います。そのため、他のコンパイラが使用されると、他の(またはまったく)非推奨の構造が呼び出されます。

[1] Xcodeでメソッドを非推奨にする方法

于 2012-07-11T14:38:34.087 に答える