Objective-Cの勘所6 アクセサの扱い

今回はアクセサについて説明する。

アクセサについて

Objective-Cにはアクセサを自動的に生成してくれる機能が存在する。
アクセサの宣言は@propertyで行う。ヘッダファイル(.h)に記述する。

書式

@interface Class : SuperClass {
    変数型1 *変数名1;
    変数型2 変数名2;
}
@property (属性) 変数型1 *変数名1;
@property (属性) 変数型2 変数名2;
@end

記述例

@interface SampleObj : NSObject {
    NSString *foo; int bar;
}
@property (nonatomic , strong) NSString *foo;
@property (nonatomic , assign) int bar;
@end

アクセサの実装は@synthesizeで行う。メインファイル(.m)に記述する。

書式

@implementation クラス名
@synthesize 変数名1;
@synthesize 変数名2;
@end

記述例

@implementation SampleObj
@synthesize foo;
@synthesize bar;
foo = 5; //アクセサで変数を操作する
bar = 10; //アクセサで変数を操作する
@end

属性について

assign

setterで単純代入を使用することを指定します。これはデフォルトで適用されます。このキーワードを使う場合、アプリケーションはガーベジコレクション(GC)を使っていないと、単純代入は適切な振る舞いではなくなるためコンパイラ警告が発生します。GCでないアプリケーションの場合は、オブジェクトへの警告を避けるために、格納方法の属性の1つを明示的に指定する必要があります。GCを使わないアプリケーションで変数がNSCopyingプロトコルを採用していると、その状況でのassignの使用は通常は適切でないため、この属性に対して警告が発生します。

retain

代入時にオブジェクトに対してretainを呼び出す必要があることを指定します。この属性はObjective-Cオブジェクトに対してのみ有効です(Core Foundationオブジェクトに対してはretainは指定できません。詳しくはCore Foundationを参照してください)。
※これから使用するので勝手にメモリから解放してはいけないとObjective-Cに伝える。

copy

代入にオブジェクトのコピーを使用することを指定します。コピーは、copyメソッドを呼び出すことによって作成されます。この属性はオブジェクト型に対してのみ有効であり、その場合はNSCopyingプロトコルを実装する必要があります。

nonatomic

合成されるアクセサが非アトミックになるように指定します。

readwrite

プロパティを読み取り/書き込み可能として扱うべきであることを示します。これはデフォルトで適用されます。@implementationではgetterとsetterの両方のメソッドが必須であり、@synthesizeを使う場合はgetterメソッドとsetterメソッドが合成されます。

readonly

プロパティが読み取り専用であることを示します。デフォルトは、読み取り/書き込みが可能です。ドット構文を使って値を代入しようとすると、コンパイラエラーが発生します。@implementationではgetterメソッドだけが必須であり、@synthesizeを使う場合は、getterメソッドだけが合成されます。

unsafe_unretained

assignと同じ。(ARCという新しいメモリ管理方式に対応。詳しくはARCの概要を参照。)

strong

強い参照と認識されるようになる。retainと同じ。(ARCという新しいメモリ管理方式に対応)
※デフォルトは強い参照となるので、通常は指定する必要はない。

weak

弱い参照と認識されるようになる。(ARCという新しいメモリ管理方式に対応)

参考
Objective-C ARCによるメモリ管理 | YOHEI’s BLOG
ダイナミックObjective-C (104) プロパティ(4) – プロパティの属性 | マイナビニュース