2011-01-16 5 views

答えて

1

1行で複数のオブジェクトを解放する方法がありますが、推奨しません。安全にオブジェクトを解放するための良い方法があります:

#define RELEASE_SAFELY(__POINTER) { [__POINTER release]; __POINTER = nil; } 

は使用方法:両方の長所を持っていないのはなぜ

RELEASE_SAFELY(myObject);  
+0

'[pointer release]、pointer = nil;'のようにシーケンス演算子を使うこともできるので、ステートメントの結果は 'nil'になります。 – Richard

+0

私の声明の全体的なポイントは、deallocでより少ないコードを使用することです。 – WrightsCS

+0

なぜ複数のオブジェクトを1行にリリースすることをお勧めしませんか? –

0
#define foreach(item, array) \  
    for(int keep = 1, \ 
     i= 0,\ 
     size = sizeof (array)/sizeof *(array); \ 
    keep && i != size; \ 
    keep = !keep, i++) \ 
    for(item = array + i; keep; keep = !keep) 

#define RELEASE_ALL(OBJS...) ({id objs[]={OBJS}; \ 
          foreach(id* v, objs) { RELEASE_SAFELY(*v); }}) 

RELEASE_SAFELY一度に(WrightsCSのおかげで)すべてのオブジェクト:

RELEASE_ALL(Object1, Object2, Object3) // etc 
0

ここにいくつかの直接のコーディングの答えはいくつかの他の方法を追加したい、あります。

作成時にオブジェクトを自動リリースし、配列やその他のコレクションに追加することができます。配列はオブジェクトを保持し、deallocメソッドは配列を解放し、配列はすべてのオブジェクトを解放します。自動解放プールに似ています。

第2に、オブジェクトライフサイクルは何ですか?あなたはすべてのオブジェクトを作成するループを持っていて、それらだけを必要とする時に1つの場合は、ループ内/使用/のdeallocや再利用を作成することができ、例えば

for(...) 
{ 
    [[object init] alloc]; 
    [object method]; 
    [object release]; 
} 

あるいは

[[object init] alloc]; 
for(...) 
{ 
    [object setProperties]; 
    [object method]; 
} 
[object release]; 
関連する問題