2009-08-25 4 views
0

私は2つの質問があります。2つのiPhoneのメモリ管理の質問

1)どちらがobをリリースしますか?

- (void){ 
    ClassOne *ob = [[ClassOne alloc] init]; // should I use autorelease here? 
    self.O = ob; 
    [ob release]; // is this correct ?? 
} 

または

-(void)dealloc{ 
[O release]; // is this correct? 
} 

2)二つのクラス、ClassOneClassTwoがあります。

- (void) takeParam:(ClassOne *pt) { 
    // something going here 
} 

と第三のクラスのメソッド私はClassOneオブジェクトのリリースを呼び出す必要があり

- (void) runIt { 
    ClassOne *ob = [[ClassOne alloc] init]; 
    [classTwoOb takeParam:ob]; 
} 

があります:ClassTwoでの方法がありますか?

答えて

2

おそらく正しいです。

ClassOne *ob = [[ClassOne alloc] init]; // do i should use autorelease here ? 

あなたは1の保持カウントを持つオブジェクトを取得し、あなたが解放する責任があり[ClassOne alloc]呼び出します。 self.Oと仮定すると

self.O = ob; 

self.O/obretain財産ではなくassign財産である今self.O/ob 2.

[ob release]; 

の保持カウントが1本の保持カウントを持っていますがありますreleaseallocと一致します。残りの保持カウントはselfであり、selfが完了すると、Oをリリースすることを忘れないでください。

-(void)dealloc{ 
    [O release]; // is this correct ?? 
} 

良い。 Oをリリースしたことを思い出しました。今すぐOは、selfが解放されると完全にリリースされます。 (注:deallocの終わりに[super dealloc]を呼び出す必要があります。)

- (void) runIt { 
    ClassOne *ob = [[ClassOne alloc] init]; 
    [classTwoOb takeParam:ob]; 
} 

あなたはtakeParam:を呼び出した後obを解放する必要があります。メソッドは保持したいオブジェクトを保持する責任があります。 takeParam:classTwoObobを格納する場合は、メソッドが戻る前に保持する必要があります。もしそうでなければ、そうしてはいけません。

autoreleaseは、作成したオブジェクトを返すメソッドで使用します。これにより、呼び出し元にオブジェクトを保持する機会が与えられます。必要がない場合は、呼び出し元にオブジェクトを保持する機会が与えられます。ただし、オブジェクトの作成に使用されるメソッドは、常にalloc,new、または*copy*と呼ばれ、参照カウントが1のオブジェクトが返され、呼び出し元がそのリリースを担当する必要があります。

Objective-Cメモリ管理を実際に学習するには、メモリ管理プログラミングガイド、特にMemory Management Rulesのセクションをお読みください。

3

-releaseメソッドは、問題のオブジェクトの保持カウントを減らすだけです。保持カウントがゼロになると、ランタイムは-deallocを呼び出します。いつでもあなたはalloccopy、またはretainメッセージを送信する場合

後でreleaseまたはautoreleaseを呼び出す必要があります。

詳細については、this excellent answerを参照してください。