ゆるい感じのプログラムを書きたい。

プログラムの敷居を下げて、多くの人が開発出来るように色々書いていきます!

【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を使うときはこんな感じです。

f:id:kassans:20140913111753p:plain

  • Retainを使い終わった後はこんな感じです。

f:id:kassans:20140913111819p:plain

上記のRetainには下記のようなデメリットもあります。

  • デメリットはこんな感じです。

f:id:kassans:20140913111914p:plain

f:id:kassans:20140913111930p:plain


Assign(Weak)の説明

  • 下記のように「assign」を利用した、propertyを作成します。
//property宣言 データ型_setter,getter名前指定なし
@property (nonatomic,assign) char   charcter1;

この場合、以下の図のような使われ方となります。

  • Assignを使うときはこんな感じです。

f:id:kassans:20140913112012p:plain

  • Assignを使い終わった後はこんな感じです。

f:id:kassans:20140913112028p:plain


Copyの説明

  • 下記のように「copy」を利用した、propertyを作成します。
//property宣言 データ型_setter,getter名前指定なし
@property (nonatomic,copy) NSObject *object_charcter2;

この場合、以下の図のような使われ方となります。

  • Copyを使うときはこんな感じです。

f:id:kassans:20140913112047p:plain

  • Copyを使い終わった後はこんな感じです。

f:id:kassans:20140913112102p:plain

上記のCopyには下記のようなメリットもあります。

  • メリットはこんな感じです。

f:id:kassans:20140913112118p:plain

f:id:kassans:20140913112135p:plain

MRCとARCの違い

Javaのガーベージコレクションに似ているため、 ガーベージコレクションをイメージして図を作成しております。

MRCの場合このようにメモリを解放します。

f:id:kassans:20140913112329p:plain

f:id:kassans:20140913112412p:plain

ARCの場合このようにメモリーを解放します。

f:id:kassans:20140913112205p:plain

次回は、実装編を記載していきます。