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

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

アクセサについて

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

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

 
ヘッダファイル(.h)の記述例としては以下のようになる。

@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

 
メインファイル(.m)の記述例としては以下のようになる。

@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) – プロパティの属性 | マイナビニュース

Article written by

コメントを残す