【iPhoneアプリ】プロパティとは
以前、「【iPhoneアプリ】基本を忘れないように「オブジェクト指向」について」の回で
記載した際に、オブジェクト指向では、 メソッドで「引数に値を代入してクラスの値を更新したり」「クラスの値を取得したり」を 作成し行うと書きました。
そのような機能を「アクセッサメソッド」といいます。
アクセサメソッド「setter(値更新)」「sgetter(値取得)」を自分で記述するのは
非常にめんどくさくて書きたくないです。
そのため、Object-cでは「@property」を利用することにより 「getter」「setter」の記述を省く事が出来 また、以下の要素を持たせる事が可能となります。
アクセス制限
プロパティ属性 | 意味 |
---|---|
readwrite | getter(読込み)/setter(書込み)両方利用可能(デフォルト指定) |
readonly | setter(読込み)のみ可能 |
オブジェクトを代入する際の操作
手動メモリ管理(MRC: Manual Reference Counting)の場合
プロパティ属性 | 意味 |
---|---|
retain | オブジェクトをretain(カウンターを1加算)してから代入 |
assign | オブジェクトをそのまま代入(デフォルト) |
copy | オブジェクトをcopyしてから代入 |
自動メモリ管理(ARC: Automatic Reference Counting)の場合
プロパティ属性 | 意味 |
---|---|
strong | オブジェクトをretain(カウンターを1加算)してから代入 |
weak | オブジェクトをそのまま代入(デフォルト) |
copy | オブジェクトをcopyしてから代入 |
その他
プロパティ属性 | 意味 |
---|---|
unsafe_unretained | オーナーシップ権を持たないプロパティ |
アクセッサメソッド名
プロパティ属性 | 意味 |
---|---|
getter=GETメソッド名 | GETメソッド名の指定 |
setter=SETメソッド名 | SETメソッド名の指定 |
マルチスレッドからのアクセス時の処理
プロパティ属性 | 意味 |
---|---|
atomic | アクセス時に同期処理で処理を行う |
nonatomic | アクセス時に非同期処理で処理を行う |
では、実際にソースを書いて、図でも表現してみます。
Retain(Strong)の説明
- 下記のように「retain」を利用した、propertyを作成します。
//property宣言 データ型_setter,getter名前指定なし @property (nonatomic,retain) NSObject *object_charcter2;
この場合、以下の図のような使われ方となります。
- Retainを使うときはこんな感じです。
- Retainを使い終わった後はこんな感じです。
上記のRetainには下記のようなデメリットもあります。
- デメリットはこんな感じです。
Assign(Weak)の説明
- 下記のように「assign」を利用した、propertyを作成します。
//property宣言 データ型_setter,getter名前指定なし @property (nonatomic,assign) char charcter1;
この場合、以下の図のような使われ方となります。
- Assignを使うときはこんな感じです。
- Assignを使い終わった後はこんな感じです。
Copyの説明
- 下記のように「copy」を利用した、propertyを作成します。
//property宣言 データ型_setter,getter名前指定なし @property (nonatomic,copy) NSObject *object_charcter2;
この場合、以下の図のような使われ方となります。
- Copyを使うときはこんな感じです。
- Copyを使い終わった後はこんな感じです。
上記のCopyには下記のようなメリットもあります。
- メリットはこんな感じです。
MRCとARCの違い
Javaのガーベージコレクションに似ているため、 ガーベージコレクションをイメージして図を作成しております。
MRCの場合このようにメモリを解放します。
ARCの場合このようにメモリーを解放します。
次回は、実装編を記載していきます。