tomoyaonishiのブログ

iOSのことを中心に・・・その他もあるよ!

メソッド、クラス、変数、定数宣言時に使えそうなものまとめ

iOS開発でメソッド、クラス、変数、定数の宣言に使えそうなものをまとめました。 Appleのヘッダーファイルを見ているとよく出てくる

NS_AVAILABLE_IOS

みたいなやつで個人的に使えそうだと思ったものをまとめます。


資料はこちら


NS_CLASS_DEPRECATED_IOS

指定したOSバージョンからそのクラスを非推奨にします。

NS_CLASS_DEPRECATED_IOS(7_0, 7_1)
@interface TestClass : NSObject

@end

iOS7.0まではOK、iOS7.1からは非推奨(Deprecated)という意味になります。 実際にXcodeでiOS7.1の環境でTestClassを使ってコンパイルしようとするとワーニングが出るようになります。

NS_CLASS_AVAILABLE_IOS

特定のOSバージョンからそのクラスを使えるようにします。

NS_CLASS_AVAILABLE_IOS(7_1)
@interface TestClass : NSObject

@end

TestClassはiOS7.1から利用可能になります。

NS_AVAILABLE_IOS

指定したOSバージョンからクラス、メソッド、定数を使えるようにします。

@interface TestClass : NSObject

- (void)method NS_AVAILABLE_IOS(7_1);

@end

methodメソッドはiOS7.1以降の環境でないと呼べません。定数の後ろに宣言することで定数にも同じ制限がかかります。

NS_DEPRECATED_IOS

指定したOSバージョンからクラス、メソッド、定数を非推奨にします。

FOUNDATION_EXPORT 
CGFloat const kTestClassConstant NS_DEPRECATED_IOS(6_0, 7_0);

iOS7.0以上でこの定数を利用しようとするとコンパイラがワーニングを出してくれます。

NS_UNAVAILABLE

いかなる環境でもそのクラス、メソッド、定数を使えないようにします。

@interface TestClass : NSObject

- (void)unavailableMethod NS_UNAVAILABLE;

@end

unavailableMethodは絶対に呼ぶことはできません。利用しようとするとコンパイラはワーニングではなく、エラーを出します。

NS_REQUIRES_SUPER

サブクラスでオーバライドした際にスーパークラスメソッドを呼ぶようにします。 なにげにかなり便利です。

@interface TestClass : NSObject

- (void)overrideMethod NS_REQUIRES_SUPER;

@end

TestClassをサブクラス化し、overrideMethodをオーバーライドした時に、[super overrideMethod]の形で呼び出さないとコンパイラがワーニングを出します。

NS_REQUIRES_NIL_TERMINATION

可変長の引数の最後に必ずnilを指定するようにします。

@interface TestClass : NSObject

- (void)method:(NSString *)first, ... NS_REQUIRES_NIL_TERMINATION;

@end

methodの引数の最後にnilをしてしなければならないようになります。UIAlertViewのあれですね。

NS_ENUM

定数を列挙します。

typedef NS_ENUM(NSUInteger, TestClassOptions) {    
    TestClassTypeA,
    TestClassTypeB,
    TestClassTypeC,
    TestClassUnknown = NSUIntegerMax
};

NS_OPTIONS

ビット演算によるオプションを列挙します。

typedef NS_OPTIONS(NSUInteger, TestClassOptions) {
    TestClassOptionsNone    = 0,
    TestClassOptionsA          = 1 << 0,
    TestClassOptionsB          = 1 << 1,
    TestClassOptionsC          = 1 << 2,
    TestClassOptionsAll        = A | B | C
};

instancetype

返り値のインスタンスの型がそのクラスであることをチェックします。

@interface TestClass : NSObject

- (instancetype)init;

@end

initの返り値をTestClassとそのスーパークラス以外の型に入れようとするとコンパイラがワーニングを出します。

__unused

未使用であることを宣言します。

static CGFloat const __unused kConstant = 10.0;

unusedを付けないとコンパイラが未使用の定数とワーニングを出してきますが、unusedをつけることで黙らせることができます。統一性のために宣言だけしたい変数や将来使う定数、変数のために使うと便利かもしれません。

__strong

強参照でインスタンスが解放されないようにします。 変数宣言で使えます。

__weak

弱参照で参照先が解放されたとき自動でnilをセットします。 変数宣言で使えます。

__block

ブロックの中で書き換えできるようにします。 変数宣言で使えます。

__unsafe_unretained(非ARC)

参照先が解放されても自動でnilをセットせず、 retainもしないためクラッシュする可能性があることを示します。 変数宣言で使えます。