Objective-C 2.0で非推奨としてメソッドにフラグを付けるにはどうすればよいですか?


141

私はかなり大きなiPadアプリを開発しているチームの一員です。その結果、私たちが作成したさまざまなクラスがたくさんあります。問題は、いくつかのメソッドが現在はほとんど使用されておらず、システム全体の一部がメソッドを使用していることを知っているため、それらを単に削除したくないだけです...しかし、使用する必要があるより良い(新しい)バリアントがあります代わりに(古いもののいくつかは実際に新しいものを呼び出しますが、全体的なクラスインターフェイスが乱雑になっています)。

特定のメソッドを(@deprecatedJavaや[Obsolete].NETのように)減価償却済みとしてマークする方法はありますか?

AppleがAvailability.hを使用しており、次のようなタグがあることを確認しました

__OSX_AVAILABLE_BUT_DEPRECATED(__MAC_NA,__MAC_NA,__IPHONE_2_0,__IPHONE_3_0);

...これがそれを行う唯一の方法ですか(+ App Storeで安全ですか?)またはXcodeで警告を通知する代替手段はありますか

回答:


163

非推奨の構文

メソッドを非推奨としてマークする構文が提供されています。

@interface SomeClass
-method __attribute__((deprecated));
@end

または:

#include <AvailabilityMacros.h>
@interface SomeClass
-method DEPRECATED_ATTRIBUTE;  // or some other deployment-target-specific macro
@end

7
このマクロは私には理にかなってい__attribute__ます。構文の感じを保持しています。#define __deprecated__ __attribute__((deprecated))
ゼケル

興味深いことに、Xcodeは、減価償却済みとマークされたメソッドを使用することに対して警告を発しません。設定する必要があるコンパイラフラグはありますか?
memmons 2011

Xcodeのコード補完ドロップダウンで、メソッドが減価償却済みとしてマークされているのがわかりますが、それを使用してもコンパイラの警告は出されません。
memmons 2011

1
@Answerbotビルド設定>廃止された関数について警告する...これをYESに設定します
bandejapaisa

使用する代替方法を追加する方法は?
OXXY

135

私見、__deprecatedを書く方が簡単です:

- (void)myDeprecatedMethod __deprecated;
- (int)methodNameDeprecated:(int)param __deprecated;

クラスでも動作します

__deprecated
@interface MyDeprecatedClass

  // ... some properties and methods ...

@end

2
これを行うはるかに良い方法。
SG1 2013

1
説明が提供されていないため、別の方法を使用する必要があるかどうかはわかりません...
raistlin

1
#define __deprecated __attribute __((deprecated))
Parag Bafna 2018年

なぜそれがより良いのですDEPRECATED_ATTRIBUTEか?短いのか、実際の違いがあるのですか?
ケリン

88

deprecationフラグを使用して追加のメッセージを送信する場合は、次のフラグを使用できます。

@property (strong, nonatomic) NSString *catName
                    __deprecated_msg("use name instead.");

//  -- Or -- 
@property (strong, nonatomic) NSString *catName
                    DEPRECATED_MSG_ATTRIBUTE("use name instead.");

//  -- Or -- 
@property (strong, nonatomic) NSString *catName
                    __attribute__((deprecated("use name instead.")));

上記のフラグを使用すると、廃止予定の理由や、今後開発者が使用するメソッドを特定できます。


2
非推奨の警告を含むメッセージを希望します。APIの新規ユーザーにとっては、はるかに役立ちます。だから、これが最良の答えだと思います。
johnnieb 2014

私はこの答えが一番好きです。必要なものだけをコピーして貼り付けて使用するのが最も明確で簡単です。メソッドを非推奨にするサンプルでそれを強化してもらえますか?クラス全体?まったく同じ方法で行われますか?
Motti Shneor

15

メソッドに非推奨のマークを付けるには、__ attribute __((deprecated( "Your messages along here")))を使用します

マントルの実用的な例

@interface NSValueTransformer (UnavailableMTLPredefinedTransformerAdditions)

+ (NSValueTransformer *)mtl_externalRepresentationTransformerWithModelClass:(Class)modelClass __attribute__((deprecated("Replaced by +mtl_JSONDictionaryTransformerWithModelClass:")));
+ (NSValueTransformer *)mtl_externalRepresentationArrayTransformerWithModelClass:(Class)modelClass __attribute__((deprecated("Replaced by +mtl_JSONArrayTransformerWithModelClass:")));

@end

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.