前回、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
参考資料
- Transitioning to ARC Release Notes | iOS Developer Library
- Beginning ARC in iOS 5 Part1 | Ray Wenderlich
- Beginning ARC in iOS 5 Part2 | Ray Wenderlich
- iOS5 By Tutorials Chapter 3: Intermediate ARC (PDF Book by Ray Wenderlich and others)
- Objective-C Automatic Reference Counting (ARC) | The LLVM Compiler Infrastructure
- エキスパートObjective-Cプログラミング -iOS/OS Xのメモリ管理とマルチスレッド-
ARCの詳細を書きました↓
インプレスジャパン
売り上げランキング: 243,952
iOS 6 UICollectionViewについて書きました↓
インプレスジャパン
売り上げランキング: 4,856