2009年8月30日日曜日

iPhone:インスタンスの生成と破棄(その1)

[1]インスタンスの破棄は参照カウンタに基づいて行われます。
  • インスタンス生成時 カウンタ+1
  • retainメソッド実行 カウンタ+1
  • releaseメソッド実行 カウンタ-1
カウンタが0になるとインスタンスは破棄されます。

[2]インスタンスの自動破棄
イベントが発生してアプリケーションの処理が実行されるとき、そのイベント処理内で生成したインスタンスを、イベント処理後に自動的に破棄する(releaseメソッドが実行される)仕組みがあります。インスタンスの生成の方法によって自動破棄の対象になるものとならないものがあります。

(A)自動破棄されないインスタンス
以下のメソッドで生成されたインスタンスは自動的に破棄されません。
  • alloc / allocで始まるメソッド
  • new / newで始まるメソッド
  • copy / copyで始まるメソッド
インスタンスが不要になった時点で明示的にreleaseを実行する必要があります。
(もしくは、インスタンス生成後にautoreleaseを実行することで自動的に破棄されるようになります。)

(B)自動破棄されるインスタンス
(A)以外の方法で生成されたインスタンスはイベント終了後に自動的に破棄されます。明示的にreleaseを実行する必要はありません。

2点注意があります。
・インスタンス変数に格納して保持したい場合
イベント後に破棄されてしまわないように、retainを実行してからインスタンス変数に代入する必要があります。
・イベント中に大量にインスタンス生成する場合
メモリの使用量を抑えるために自動破棄のネストを使用します。
アプリケーション内で独自のNSAutoReleasePoolを作成し、自動破棄処理させます。


for ( int i = 0 ; i<=100 ; i++ ) {
// NSAutoReleasePoolを生成
NSAutoReleasePool* arp = [[NSAutoReleasePool alloc] init];
// インスタンスを生成する処理
・・・
// NSAutoReleasePoolを破棄 > arpに登録された全てのインスタンスにreleaseが送られる。
[arp release];
}

[3]インスタンスを他から受け取って使う場合
以下の3種類の方法を使い分けます。

(A)受け取った後retainし、不要になったらreleaseする
インスタンス変数に代入する場合 かつ、他と同じインスタンスを共有したい場合

(B)受け取った後、copyし、不要になったらreleaseする
インスタンス変数に代入する場合 かつ、他と同じインスタンスを共有する必要が無い場合
この場合自分がオーナーになります。

(C)何もしないでそのまま使う
ローカル変数として使う(メソッドの中だけで使う)場合

0 件のコメント:

コメントを投稿