最終更新:2013-01-09 (水) 09:17:56 (4087d)
Automatic Reference Counting
Top / Automatic Reference Counting
iOS 5(Xcode 4.2)で導入。必要なコードをコンパイラ(LLVM 3.0)が自動で挿入してくれる
機能
- コンパイラがretain, release, autoreleaseを挿入してくれる(自分で呼んではいけない。コンパイラエラーになる)。
- dealloc?を適切な位置に挿入してくれる(deallocのオーバーライドは可能。ただし[super dealloc]は不可能)。
@property
- 下記の属性が追加
所有修飾子
ClassName * qualifier variableName;
__strong? (強い参照)
- デフォルト (Xcode 4.3〜)
- 何も書かずに変数宣言をした場合、すべて強い参照となる
__weak? (弱い参照)
__unsafe_unretained?
- 参照形態は__weakと同等だが、こちらはnil初期化やZeroingが行われない
- 参照先のオブジェクトが破棄されたあともアドレスが残っているので使用の際には注意
__autoreleasing?
- used to denote arguments that are passed by reference (id *) and are autoreleased on return.
Objective-C/ディレクティブ
スライド
注意点
- AppleのTransitioning to ARC Release Notesによると、ARCを利用する際には以下のルールを守る必要がある
- retain, release, retainCount?, autoreleaseをコールしてはいけない。また、これらのメソッドを実装してもいけない。
- dealloc?をコールしてはいけない(オブジェクトの解放以外の処理が必要な場合、dealloc?を実装することは可能。ただし、[super dealloc]はコールしない)。
- NSAllocateObject?, NSDeallocateObject?は使えない。
- C構造体の中でオブジェクトポインタを使うことができない(代わりにObjective-Cのクラスを生成すべき)。
- idとvoid*間でのキャストには特定の方法を利用する必要がある。
- NSAutoReleasePool?は使えない。ただし、@autoreleasepoolブロックの使用が可能。
- メモリゾーン?は使えない。
- “new”から始まるプロパティ名は使えない。
関連
- メモリ管理
- MRC? - Manual Reference Counting
- ガベージコレクション