ARC for Objective-C

ARCというのを、勉強しています。

今まで、Objective-Cのメモリ管理は、手動で、retain ,release ,autoreleaseしないといけなかったのが、コンパイラが自動で行うようになる技術です。


ガーベージコレクションではなく、リファレンスカウンタです。
コンパイラが、ソースリストを解釈して、必要なところに、retain , release ,autorelease などを挿入してくれるそうです。
リファレンスカウンタなので、iOSでも使用可能です。

そうか。。Appleが、iOSアプリのために、たどり着いた答えが、ARCだったんだ。。


MacOSX は、Lionから、iOSは、iOS 5 から、有効に出来るようです。
まだ、勉強中なので、分からないことが多いですが。。

(ちなみに、Snow Leopardからも、iOS 5のアプリは作れるので、Snow Leopardからでも、iOS 5 のアプリなら、ARCは使えるようです。)


ARCを有効にしていると、retain, release,autorelease は、記述しなくてもよくなるというか、記述すると、エラーで怒られます。


変数を宣言するときに、__strong 修飾子か、__weak 修飾子を付けます。

__strong 修飾子を付けると、強い参照で、所有することが出来るので、スコープの先頭で、(必要なら)retainを自動で送信してくれます。
スコープの終わりで、releaseを自動で送信してくれます。
release 時に、参照カウンタが0になっていれば、オブジェクトが解放されます。


__weak 修飾子は、__strong では、循環参照になってしまうときや、しばらく他のオブジェクトを参照したいときに、主に使用されます。
オブジェクトへの弱い参照なので、どこかで所有されているオブジェクトへの参照を持つことが出来ます。
そのどこかのオブジェクトが参照カウンタ0になって解放されると、自動的に、__weak のオブジェクトの参照も消滅して、nilが代入されます。


というぐらいの認識ですが、こんなんでPGくめるんかいな。。



[追記]

ところで、ARCを有効にすると言うことは、Snow Leopard と、iOS 4では、動かないアプリができるということですか? Σ(゚д゚lll)ガーン

今すぐ 旧OS を切り捨てとか出来ないでしょうし、しばらくは、ARCなしで頑張ると思われますが。。

そのうち、Lion専用、iOS 5専用アプリが出てきても、不思議ではないですよね。。汗


あと、ARC有効の時は、オブジェクトへのポインタを、C言語の構造体に入れてはいけないそうです。


玉には、技術系のことも書かなければねぇ。。
そういえば、プログラマーだったんだ。。<おい


[追記]

なんか、きくところによると、最適化がきくそうで、__weak 修飾子を付けていても、コンパイラに、省略できると判断されると、省略されちゃうそうです。(汗)

だから、すごく小さいPGを、実行してみると、実行結果が違うと言うことも。
これって、ある程度長いPGでないと、ダメなのか。。