宣言プロパティに関して
Objective-Cの宣言プロパティに関して、
宣言プロパティは、アクセッサメソッド定義を簡略化することができます。
通常は、変数の定義とアクセッサメソッドの実装をするのですが、
値の設定と取得しかしないのに書かなければいけないのは、面倒なので、
宣言プロパティを使えば簡略化可能です。
まずは、通常のインターフェイス定義です。
@interface SampleA : NSObject - (id)init; - (void)setValue:(int)arg; - (int)value; @end
その実装部分です。
@implementation SampleA { int value; } - (id)init { self = [super init]; if (self != nil) { return self; } return nil; } - (void)setValue:(int)val { value = val; } -(int)value { return value; } @end
それで、宣言プロパティを使った場合
まずインターフェイス部分です。
@interface SampleB : NSObject @property(assign) int value; - (id)init; @end
次に実装部分です。
@implementation SampleB { int value; } - (id)init { self = [super init]; if (self != nil) { return self; } return nil; } @synthesize value; @end
かなり簡略化させて書くことができるので楽です。
ただし、注意が必要です。
変数が基本的な型の場合とオブジェクトの場合や
ARCを使っている場合とそれ以外のリファレンスカウンターやGCの場合などでは、
書き方が違います。
ARCかそれ以外は、多分ARCしか使わないと思うので、
書き方としては、オブジェクトかそれ以外かがわかっていれば問題ないと思います。
インターフェイスのプロパティ宣言の違いは、ないです。
通常の型の場合
@interface SampleB : NSObject @property(assign) int value; @end
オブジェクト型の場合
@interface SampleB : NSObject @property(assign) NSNumber *value; @end
次に実装部分です。
通常の型の場合
@implementation SampleB { int value; } @synthesize value; @end
オブジェクト型の場合
@implementation SampleB { __unsafe_unretained NSNumber *value; } @synthesize value; @end
ARCで、オブジェクト型のプロパティ宣言の場合、
インスタンス変数に__unsafe_unretainedを付けないと駄目です。
ちなみに、これは、assignを指定した場合なんですが、
assign以外にもunsafe_unretainedが指定されている場合も同じです。
それ以外にもstrongやretainを指定した場合は、__strongをインスタンス変数に
付ける必要があります。
あ!それとですね。
assignとunsafe_unretainedは、同じ意味で、値が代入される実装を意味してます。
strongとretainは、同じ意味で、強い参照の代入の実装を意味します。