iPhoneアプリプログラミング最初の1歩
Posted on 2011年4月11日(月) 22:15
iOSのプログラミングはObjectie-Cで行います。
C言語や他の環境のGUIプログラミングの経験があるという前提で最初に一番理解し難いのはメモリの管理だと思います。
最新のObjective-Cではガーベジコレクションといった便利な機能が利用できますがiOSでは利用できません。
よって設計者が自前でメモリ管理をしないといけません。
retain,release,alloc,deallocの使い分けが最初さっぱりわからないんですよね。
最初疑問が解決しにくかった思い出を元にヒントを箇条書きにしています。
・allocすると実体が確保され、参照カウントが1になる。
・retainすると参照カウントが1上がり、releaseすると1下がる
・参照カウントが0になると解放される
(ここまでは良くある説明で分かりやすいが、さらに初心者を苦しめるのが以下の機能)
・autorelease poolの中でautoreleaseをすると、autorelease poolが解放されるときに自動的にreleaseが呼ばれる
・autorelease poolはイベントサイクルごとに自動的に処理されているので、イベントの処理の中でautoreleaseしておけばとりあえずその処理が終わった後にreleaseされると思っていい。
・OSのAPIの中には実体を確保した上でautoreleaseされてオブジェクトが返されるものがある。
見分け方はオブジェクトっぽい名前で始まっていてクラスメソッド(+で始まるやつ)になっているもの。
・よって、イベント処理後も残したいならばretainしておかないと自動的に解放されてしまう。
・逆にautoreleaseされている状態なのにreleaseで参照カウントを0にしてしまうとイベント処理後にクラッシュする。