最終更新:2013-01-09 (水) 09:17:56 (4118d)  

Automatic Reference Counting
Top / Automatic Reference Counting

iOS 5(Xcode 4.2)で導入。必要なコードをコンパイラ(LLVM 3.0)が自動で挿入してくれる

http://developer.apple.com/library/mac/releasenotes/ObjectiveC/RN-TransitioningToARC/Art/ARC_Illustration.jpg

機能

  • コンパイラがretain, release, autoreleaseを挿入してくれる(自分で呼んではいけない。コンパイラエラーになる)。
  • dealloc?を適切な位置に挿入してくれる(deallocのオーバーライドは可能。ただし[super dealloc]は不可能)。

@property

  • 下記の属性が追加
    strong対象オブジェクトに対する強い(所有権を伴う)関係がある旨を指定
    weak対象オブジェクトに対する弱い(所有権を伴わない)関係がある旨を指定
    対象オブジェクトが割り当て解除されると、プロパティ値は自動的にnilになりる
    (弱いプロパティは、Mac OS X 10.6iOS 4では未対応なので、代わりにassignを使う)。
    copy代入にオブジェクトのコピーを使用することを指定
    以前の値にはreleaseメッセージが送信される。NSCopying?

所有修飾子

  • ClassName * qualifier variableName;

__strong? (強い参照)

  • デフォルト (Xcode 4.3〜)
  • 何も書かずに変数宣言をした場合、すべて強い参照となる

__weak? (弱い参照)

  • 参照先のオブジェクトが誰からも強参照されなくなったとき、自動的にnilが代入される(Zeroing)
  • 一般的なOutlet(IBOutlet)にはweakプロパティを使う

__unsafe_unretained?

  • 参照形態は__weakと同等だが、こちらはnil初期化やZeroingが行われない
  • 参照先のオブジェクトが破棄されたあともアドレスが残っているので使用の際には注意

__autoreleasing?

  • used to denote arguments that are passed by reference (id *) and are autoreleased on return.

Objective-C/ディレクティブ

スライド

ARCでめちゃモテiOSプログラマー from Satoshi Asano

注意点

  • AppleのTransitioning to ARC Release Notesによると、ARCを利用する際には以下のルールを守る必要がある
  • retain, release, retainCount?, autoreleaseをコールしてはいけない。また、これらのメソッドを実装してもいけない。
  • dealloc?をコールしてはいけない(オブジェクトの解放以外の処理が必要な場合、dealloc?を実装することは可能。ただし、[super dealloc]はコールしない)。
  • NSAllocateObject?, NSDeallocateObject?は使えない。
  • C構造体の中でオブジェクトポインタを使うことができない(代わりにObjective-Cのクラスを生成すべき)。
  • idvoid*間でのキャストには特定の方法を利用する必要がある。
  • NSAutoReleasePool?は使えない。ただし、@autoreleasepoolブロックの使用が可能。
  • メモリゾーン?は使えない。
  • “new”から始まるプロパティ名は使えない。

関連

参考