HOME » Natsu note » iOS » [iOS5] ARC : プロパティ属性と使い方

[iOS5] ARC : プロパティ属性と使い方 2011/11/18/|iOS, ,

前回、ARC OverviewでARC(Automatic Reference Counting)の基本概念と__strong, __weak等の修飾子についてまとめました。今回は、Objective-Cではよく使われるプロパティについてみていきます。

オーナーシップ属性

ARC対応により、これまでのセッターに関するプロパティ属性に加えていくつかの属性が追加されました。以下の表が、ARCで有効な属性とそのオーナーシップ(修飾子)との関係です(太字がARCによって追加になったもの)。

プロパティ属性 修飾子 オーナーシップ
strong __strong あり
weak __weak なし
copy __strong あり(コピーオブジェクトが代入される)
unsafe_unretained __unsafe_unretained なし
assign __unsafe_unretained なし
retain __strong あり

strong

__strong修飾子に対応するプロパティ属性です。strong属性を用いたプロパティは参照先オブジェクトのオーナーとなります。

weak

__weak修飾子に対応するプロパティ属性です。__weak修飾子を持った変数と同様、weak属性のプロパティも、参照先のオブジェクトが破棄されたら自動的にnilが代入されます。weak属性を用いたプロパティはオーナーシップ権を持ちません。

weak属性は、delegateやOutletの変数に最適です。

なお、iOS 4では__weak修飾子が使えないため、プロパティのweak属性も使えません。この場合は、後述のunsafe_unretainedを使いましょう。

copy

__strong修飾子に対応しますが、実際にはコピーオブジェクトが代入されます。copy属性を用いたプロパティは参照先オブジェクトのオーナーとなります。

unsafe_unretained

__unsafe_unretaind修飾子に対応するプロパティ属性です。iOS 4では、weak属性が使えないため、オーナーシップ権を持たないプロパティを作成したい場合、こちらを利用する必要があります。

assign

主にスカラー変数(intやBOOLなど)のプロパティ属性として利用されます。

オブジェクトに対して使用することも可能ですが、オーナーシップ権を持たないプロパティを作成したい場合、weak(iOS 5以上)もしくはunsafe_unretained(iOS 4を含む)を利用すべきでしょう。

retain

retain属性も利用することは可能です(strong属性と同じ働きをします)。しかしながら、ARC対応のコードでは、strong属性を使った方が明白でよいでしょう。

読み書きに関する属性 (readwrite, readonly)

読み書きに関する属性にはreadwriteとreadonlyの二通りが存在します。ARCを利用すると、オブジェクトに対してreadonly属性を用いるときに注意が必要です。

これまで、

@property (nonatomic, readonly) NSString *name;

のような書き方が可能でした。この書き方ではセッターに関する属性(オーナーシップ属性)を指定していませんが、そもそもreadonlyなのでセッターは不要ですから問題がなかったのですね。

しかしながら、ARCを利用すると、上記のコードでは以下のようなコンパイラエラーとなります。
“ARC forbids synthesizing a property of an Objective-C object with unspecified ownership or storage attribute”

ARCでは、オーナーシップ属性のないプロパティは実装できないということです。このコードは、以下のように書き換えることでエラーを回避できます。

@property (nonatomic, strong, readonly) NSString *name;

実際にはreadonlyプロパティなのでstrongは意味をなしませんが、このように記述する必要があるようです。

なお、スカラー値のプロパティはデフォルトとしてassign属性となりますので、あえて明示的にassignを設定しなくても問題はありません。

まとめ

前回の修飾子に加えて、プロパティ属性についてまとめました。これで、ARCの基本中の基本は抑えたことになります。

次回は、プロパティ関連の続きとして、Outletはweak属性を使うと便利だという件についてまとめたいと思います。

質問、間違いの指摘などはtwitterでお願いします。@natsun_happy

参考資料

ARCの詳細を書きました↓

iOS5プログラミングブック
加藤 寛人 吉田 悠一 藤川 宏之 西方 夏子 関川 雄介 高丘 知央
インプレスジャパン
売り上げランキング: 243,952

iOS 6 UICollectionViewについて書きました↓

iPhoneアプリ開発エキスパートガイド iOS 6対応
加藤 寛人 藤川 宏之 高丘 知央 西方 夏子 吉田 悠一 関川 雄介
インプレスジャパン
売り上げランキング: 4,856