2010-12-02 16 views
0

私はIBActionインスタンスメソッドdosomethingを持つ1つのコントローラクラスXを持っています。クラスの割り当てと解放

私はいくつかの計算を行い、自己を委任する他のクラスYを持っています。

このメソッドでは、クラスYのインスタンスが作成されます。ここでYのインスタンスが解放されるべきです。@propertyはこのための唯一の解決策です。

//このアクションは、クラスXにある

- (IBAction)がdoSomethingの:(ID)、送信者 {

のY *はY = [YのALLOC] INIT]。

// initメソッドがYで実装されていて、その代理人だけでなく、何らかのジョブが実行されています。 yをリリースする場合は それはクラッシュだろう。そこでyを解放する場所はどこですか? @propertyは1回のメモリを作成してそれを使用することによって解決されます。 次回に他のオブジェクトが作成されたときにのみ、これを解放する方法はありますか?

// [yリリース];そのクラッシュ。

}

+1

こんにちは。ほんの少しの意味論的問題:クラスは一度だけ割り当てられ、Objective-CランタイムがメモリAFAIKから取り出されるまで、決して「解放」されたり、割り当て解除されることはありません。だから、あなたが本当に疑問に思っているのは**クラス**ではなく**オブジェクト**の割り当てとリリースです。他の言語(特にクラスにプロトタイプをモデル化する言語)では、この区別は重要ではありませんが、Objective-Cでは非常に重要です。クラスもオブジェクトであり、オブジェクト自体のオブジェクトの機能を管理します。 –

+0

こんにちはジョナサンありがとう。クラスが作成されていて、クラス自体がそのオブジェクトを持っていて、クラス自体が他のクラスのオブジェクトであると言う場合、クラスYを解放する必要があります。 XでYの作成と破壊 – ashish

答えて

0

あなたは一つのこと、

// In the .h file 
// declare like this. 
Y *y; 

// In the .m file 

-(IBAction)dosomething:(id)sender { 

    if(y== nil) 
     y = [[Y alloc]init]; 

} 

とdeallocメソッドで操作を行うことができ、あなたが

- (void)dealloc{ 
    [y release]; 
    [super dealloc]; 
} 
+0

このメソッドが呼び出される回数が少ない場合 - (IBAction)dosomething:(id)送信者。その時点ではゼロになることはありません。したがって、そのメソッドのヒット数が少なくても新しいインスタンスが同時に作成されるわけではありません。 – ashish

0

を解放することができ、それは私には思える、解決する最も簡単な方法は、その問題はY deallocY.delegate = nilを呼び出し、Y.delegateメソッドを呼び出す前にY.delegate == nilがあるかどうかを確認することです。

0

あなたはいくつかの仕事がクラスYのinitメソッドで行われていると言います。作業が完了するまで、一部の代理人がYのオブジェクトを必要とするところです。その後、Yを解放したい。

その代理人にYのプロパティがあるので、それを保持する。それを解放して、一度作業が終わったらそれを無しに設定してください。

したがって、Xのdosomething()メソッドでは、Yのインスタンスをすぐに解放できます。 このルールを念頭に置いて、Xが仕事が完了するまでYが生きる必要があるときは、所有権を取得するだけです。

これは、オブジェクトが複数の所有者を持つことができるように、保持カウントがObj Cで維持される理由です。すべての所有者がメモリから削除されたオブジェクトのみを解放するとき。

+1

クラスYにはn人のデリゲートがいますので、デリゲートでそれを保持することは実現できません。 – ashish

+0

実際には問題ではありません。すべてのデリゲートがオブジェクトの保持を保持できるため、retainCountはデリゲートカウントと等しくなります。リリースのすべてが最終的にオブジェクトがリリースされるように。 –

関連する問題