ARC学習まとめ


1、ARCの基本認識
ARCは全称ARC(Automatic ReferenceCounting)と呼ばれ、iOS 5/Mac OS X 10.7で導入を開始し、Xcode 4を利用する.2この機能を使用することができます.
ARCを簡単に理解すると、指定された構文により、コンパイラ(LLVM 3.0)がコードをコンパイルする際に、インスタンスの参照カウント管理部分コードを自動的に生成するようにすることである.一つ、ARCはGCではなく、コード静的解析(Static Analyzer)ツールにすぎない.
1)ARCを使うメリット
o上記の例を見て、皆さんは知っています.これからObjective-Cのコードを書くのは簡単になります.煩わしいメモリ管理を心配する必要はありません.メモリの漏洩を心配する必要はありません.
oコードの総量が少なくなり、さわやかに見え、労働力も節約できました
oコードの高速化により、コンパイラを用いて参照カウントを管理するため、低効率コードの可能性が低減

2)悪いところ


o新しいARCルールを覚える—キーワードや特性など一定の学習サイクルが必要
oいくつかの古いコードは、サードパーティのコードが使用されるときに面倒です.コードを変更するには工数が必要です.コンパイルスイッチを変更するか
第2点については、XCode 4.2ではデフォルトARCがONの状態なので、古いコードをコンパイルする際に「Automatic Reference Counting Issue」というエラーメッセージがよくあります.このとき、プロジェクトコンパイル設定の「Objectice-C Auto ReferenceCounteting」をNOにすることができます.
誰かにだけmファイルはARCに適応せず、このクラスファイルに-fno-objc-arcを加えてFLAGSをコンパイルするだけでよい.(これに対応するのは-fobjc-arc)

3)ARC基本ルール


o retain,release,autorelease,deallocはコンパイラによって自動的に挿入され、コードで呼び出すことはできません
o deallocはリロードできますが[super dealloc]は呼び出せません
o NSAllocateObject,NSDellocateObjectは使用できません
o C構造体でのオブジェクトポインタの使用はできません
o idとvoid*の間のcastの場合は特定のメソッド(_bridgeキーワード)が必要です
o NSAutoReleasePoolではなく@autoreleasepoolブロックが必要
o「new」から始まる属性名は使用できません(次のコンパイルエラー「Property's synthesized getter followsCocoa nameing convention for returning'owned'objects」を使用する場合)
ARCはGCではなく、コンパイラがコード挿入をサポートするルールが必要であるため、これらのルールを明確にしてから、丈夫なコードを書く必要があります.

4)Objective-Cオブジェクト


Objectivecのオブジェクトには、強い参照(Strong reference)と弱い参照(Weak reference)の区別があり、他のオブジェクトを保持する必要がある場合は、オブジェクト参照カウントに1を加算するようにretainが必要です。オブジェクトの所有者(owner)が存在する限り、そのオブジェクトの強い参照は常に存在する。


5)オブジェクト処理の基本ルール
oオブジェクトの所有者が存在する限り(オブジェクトは強く参照される)、そのオブジェクトを使用することができる
o相手が持ち主を失った後、破棄される

6)参照キーワード


_strong
変数宣言はデフォルトで_strongキーワードは、変数がキーワードを何も書かない場合、デフォルトは強い参照です.
_weak
上にも見えますが、これは弱参照のキーワードです.この概念は新しい特性であり,iOS 5/Mac OS X 10.7から導入される.このタイプはオブジェクトのライフサイクルに影響を与えないため、オブジェクトの前に所有者がいない場合、作成直後に破棄されるという問題が発生します.
弱い参照には、パラメータオブジェクトが所有者を失うと、変数が自動的にnil(Zeroing)に付けられるという特徴もあります.
_unsafe_unretained
キーワードと_weak同様、弱参照であり、Weakの違いはnil付与(Zeroing)を実行するかどうかだけです.しかし,変数が指すオブジェクトは破棄され,アドレスはまだ存在するが,メモリにはオブジェクトが存在しないことに注意する必要がある.このオブジェクトにアクセスすると、「BAD_ACCESS」エラーが発生します.
_autoreleasing
このキーワードは、対像遅延を解放する.たとえば、初期化されていない対像をメソッドに参照し、このメソッドで対像をインスタンス化したい場合は、_autoreleasing .彼は、関数の値パラメータが返されるときの処理、または関数の戻り値が関数で申請される場合、呼び出し側で解放されることを望んでいる.
 
2、ARCが@propertyの使用規則に与える影響

1)所有者属性


まず、所有権に関係する属性、キーワード間の対応関係を見てみましょう.
属性値
キーワード
所有権
strong
_strong
あります
weak
_weak
なし
unsafe_unretained
_unsafe_unretained
なし
copy
_strong
あります
assign
_unsafe_unretained
なし
retain
_strong
あります
strong
この属性値は__に対応するstrongキーワード、すなわち、この属性が宣言した変数がオブジェクトの所有者になります.
weak
属性対応_Weakキーワード、Weak定義の変数は一致しており、この属性で宣言された変数にはオブジェクトの所有権がなく、オブジェクトが破棄されると、オブジェクトは自動的にnilに割り当てられます.
さらにdelegateとOutletはweakプロパティで宣言する必要があります.また、前回ご紹介したiOS 5以前のバージョンはありませんでした.Weakキーワードなので、weakプロパティは使用できません.この場合unsafeを使用しますunretained.
unsafe_unretained
に等しいunsafe_unretaindキーワード宣言の変数;上述したようにiOS 5以前のシステムはweakの代わりにこの属性で使用されていた.
copy
strongとの違いは、変数がコピーオブジェクトの所有者であることを宣言することです.
assign
一般的なScalar Varibleは、int、BOOLなどの属性で宣言されます.
retain
このプロパティはstrongと一致します.ただ、可読性がもっと強いだけです.

2)読み書き関連属性(readwrite,readonly)


読み書きに関する属性はreadwriteとreadonlyの2種類がありますが、ARCを使った後、readonly属性の使用に注意する必要がありますか。


たとえば、次の変数宣言を行います.
@property (nonatomic, readonly) NSString *name;

一般にreadonlyと宣言される変数は、所有権を持つ必要はないはずですが、ARCが有効な場合、次のエラーメッセージが表示されます.
“ARC forbids synthesizing a property of anObjective-C object with unspecified ownership or storage attribute”
ARCが有効であると定義されている場合は、所有者属性の定義が必要です.コードをこのように変更すればOKです
@property (nonatomic, strong, readonly) NSString *name; 

ただし、Scalar Varibleの変数はデフォルトでassignのプロパティ定義があるので、個別の明示的な宣言は必要ありません.

3、Objective-Cメモリ管理


Objective-Cでのメモリ管理の仕方とは、実はリファレンスカウント(Reference Counting)の使用基準を指します.オブジェクトが生成されると必ずある所有者に持たれ、複数の所有者がいるとリファレンスカウントが増加します.逆に1人の所有者を失うと、参照カウントは減少し、すべての所有者を失うまで、本当に内部テストから自分を解放します.
1)メモリ管理の基本原則
o自分で生成したオブジェクトは、その持ち主である
o自分で生成したオブジェクトではなく、その持ち主になってもよい(1つのオブジェクトを複数の人が持つことができる)
oオブジェクトを所有したくない場合は、その所有権を解放しなければならない
o所有権を持たないオブジェクトは解放できません
Objective-C言語の方法と組み合わせて、基本的なメモリ管理を見てみましょう.
方法
アクション
alloc/new/copy/mutableCopy
オブジェクトを生成して所有権を持つ
retain
オブジェクトの所有権
release
オブジェクト所有権の解放
dealloc
オブジェクトリソースの解放
Objective-C言語の内部は上の表の定義を厳格に守っている.まずalloc/new/copy/mutableCopyといういくつかの関数であり、alloc/new/copy/mutableCopyの先頭の関数であり、例えばallpcMyObject/newTheObject/copyThis/mutableCopyTheObjectなどはこの原則に従わなければならない.
alloc/new/copy/mutableCopyで始まる関数でなく、オブジェクトを返す場合は、呼び出し側はオブジェクトを生成するだけで、その所有者ではありません.