2009-04-18 13 views
9

このコードはかなりシンプルですが、それは正しいですか? initメソッドを介して渡されたデリゲートを保持する必要があるかどうかはわかりません。デリゲートについての質問

@interface SomeClass : NSObject { 
    SomeClassDelegate *someClassDelegate; 
} 
-(id)initWithDelegate:(SomeClassDelegate *)delegate; 
@end 

@implementation SomeClass 
-(id)initWithDelegate:(SomeClassDelegate *)delegate 
{ 
    [delegate retain]; // should I be doing this? 
    someClassDelegate = delegate; 
} 
-(void)dealloc 
{ 
    [delegate release]; // obviously only do this if I DO need to retain it 
    [super dealloc]; 
} 
@end 

私の初期の考えはありませんが、このコードはそうでないと思われます。私は保持カウントに頼ることができないことを知っていますが、私は代理人を扱う適切な方法を知りたいと思います。

// self's retain count is 1 
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:req delegate:self]; 
// the retain count is now 2, did the init of URLConnection retain self? 
+1

NSURLConnectionは特殊なケースです。デリゲートメッセージを受信するのを止める唯一の方法は、接続をキャンセルすることなので、デリゲートを保持するのはそれほどではありません。つまり、通常はデリゲートを保持せず、このようなNSURLConnectionの動作は実装の詳細です。あなたが頼るべきものではなく、一般的に模倣するものではありません。 また、デリゲート_class_を持つのは珍しいことです。通常、デリゲートプロトコルを宣言します。 –

+0

ありがとうマイク、それは私が見ていることを説明します。 – Jab

答えて

11

いいえ、一般的に、代理人を保持することはできません。デリゲートにはすでにオブジェクトへの参照があるため、デリゲートを保持していれば循環参照を作成することになります。同じ理由から、デリゲートが破棄される前にオブジェクトが破棄されることも想定できます。

デリゲートの使用/実装の詳細については、thesearticlesを参照してください。

編集:他にも指摘されている例外がいくつかあります。

+0

記事のおかげで、あなたは代議員に対する私の信念を確認しました。マイクはまた私の質問のコメントにNSURLConnectionで見えるものを見ている理由を私に説明しました。 – Jab

+2

状況によっては、オブジェクトが最初に破棄されることはありませんが、少なくともデリゲートは未設定になっています。 (例:UIAccelerometer) – rpetrich

1

htwによれば、一般的に代理人を保持すべきではありません。マルチスレッド環境では、たとえメソッドコールの持続時間であっても、背後で無効にならないように、必要なものをすべて保持する必要があることがよくあります。たとえば、実際にはそうでない場合、-[NSURLConnection initWithRequest:delegate]はスレッドがそのパラメータを保持している可能性がある(おそらく自動解放する)新しいスレッドを作成しました。実際には、NSURLConnectionは、接続の間デリゲートを保持する点で特別なケースです。