2009-07-09 4 views
23

私の質問のまとめ:NSURLConnectionはデリゲートを保持していますか?NSURLConnectionはデリゲートを保持していますか?

詳細な質問やシナリオ:

私はURLを取り込んで、URLが戻ることをJSONのNSDictionaryのを返しているJsonDownloaderというカスタムクラスを、持っています。

iPhoneアプリでは、このようなことをしています。この場合、呼び出し側のオブジェクトに、オブジェクト:それはreturnDataToへのコールバックを行い、JsonDownloaderダウンロードおよび解析

- (void)viewDidLoad { 
    JsonDownloder *temp = [[[JsonDownloader alloc] initWithURL:urlString returnDataTo:self]]; 
    [temp release]; 
    [super viewDidLoad]; 
} 

が行われた場合(initメソッドは、プロセス全体をキックオフ)。

これはうまくいきます。私のWebサーバーの応答に30秒の遅れを導入しても、JsonDownloaderはまだ存在し、正しくコールバックします。

私の質問はこれです:何がJsonDownloaderをイベントサイクルの最後を過ぎて守っていますか?私はそれを明示的に発表しています。

NSURLConnectionはデリゲートでretainを実行する必要がありますが、ドキュメントには何も表示されませんでした。誰でもアイデアがありますか?

答えて

25

渡される変数をコピーまたは保持しないセッターは多くありません。その変数のメモリーは、保持カウントがゼロになったときに何かに再割り当てされないようにします。

しかし、答えはYESです。テストコードの少しデリゲートのは、カウントが上がる保持を示しています。

ログに生成
NSLog(@"Retain count before: %d", [self retainCount]); 
NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://google.com"]]; 
NSURLConnection* conn = [NSURLConnection connectionWithRequest:request delegate:self]; 
NSLog(@"Retain count after: %d", [self retainCount]); 

Running… 
2009-07-09 02:13:40.516 delegateRetain[45123:a0f] Retain count before: 1 
2009-07-09 02:13:40.525 delegateRetain[45123:a0f] Retain count after: 2 

Debugger stopped. 

ですから、connectionWithRequest:delegate:に「自己」は確かにそのを持っていることはかなりはっきりと見ることができます保持カウント+1増加。あなたは勇敢な感じとEXC_BAD_ACCESSの神々を台無しにしたい場合は、

ポストのdeallocの減少を示し、再び「1」を出力します
[conn dealloc]; 
NSLog(@"Retain count after dealloc: %d", [self retainCount]); 

に追加します。

+1

大きな質問と偉大な答え。私はこれで自分自身を苦労していましたが、私は代理人が保持カウントを均等に割り当てる直後に[自己解放]を追加することに決めました。私のクラスでは自己が委任されているので、保持カウントを増やす理由は見当たりませんでした。それが間違っていると、誰かが私に知らせてくれます。 – jocull

+0

私はちょうど追加したい - ありがとう。不足しているマニュアル、パート327.これは、このような重要な事実がアップルの文書に言及されていないと信じている。私はそれを保持していると思っていましたが、確信が持てませんでした。ドキュメントは何も言わず、多くの場合、Cocoaフレームワークの代理人はほとんど保持されません。これは例外です。 – n13

9

ほとんどのデリゲート性質は保持が、循環参照を防ぐために割り当てられていない);しかし、NSAutoreleasePoolは接続を解放しようとするので、あなたは素敵なProgram received signal: “EXC_BAD_ACCESS”.を得るでしょうし、それが消えてしまいます。それについてもthisの質問を参照してください。

ただし、NSUrlConnectionには特定のデリゲートプロパティがありません。デリゲートと接続の初期化を指定する必要があります。デイブ・マトラーナが示したように、それが保持を受け取る理由だと私は思う。

7

「特別な考慮事項」のXcode Documentation for -[NSURLConnection initWithRequest:delegate:]によると、「接続はデリゲートを保持します。接続が完了するとデリゲートを解放し、失敗したりキャンセルされます。他にも:NSURLConnection inherent memory leak?

+1

これはNSURLConnectionの "Note"です。それはむしろ重要であるので、メソッドの説明で言及する必要があります。 – n13

関連する問題