Apple guideは、接続オブジェクトを解放することに関して非常に具体的です。didFailWithError
とconnectionDidFinishLoading
で行われます。しかしNSURLConnectionを使用した非同期要求:解放するとき
、私は同じことを行うとき、私は後でそれはそう
*** -[NSURLConnection releaseDelegate]: message sent to deallocated instance 0x1001045b0
ゾンビモードでこれを取得し、私のための接続を解放するのAppKitでのいくつかのコードがあります。
私はアップルのガイドが間違っていると思いますが、恐ろしいメモリリークを取得したり、古いOSXバージョンなどの微妙な非互換性を導入したくないと思います。
この場合、ドキュメントを無視しても安全ですか?
編集
コードあなたが
[NSURLConnection connectionWithRequest:request delegate:delegate];
との接続を作成しましたので、あなたが「ドン要求
URLConnectionDelegate *delegate = [[URLConnectionDelegate alloc] initWithSuccessHandler:^(NSData *response) {
...
}];
[NSURLConnection connectionWithRequest:request delegate:delegate];
// I do not release delegate when testing for this issue, not sure whether I should in general
Delegateクラス自体
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
successHandler(receivedData);
[receivedData release];
Block_release(successHandler);
// do we really need this????????
[connection release];
}
docsから: 'NSURLConnection'は、デリゲートを初期化するときにそのデリゲートを保持します。接続が完了すると、デリゲートを解放します。失敗するか、キャンセルされます。デリゲートを過剰にリリースしたようです。 –
@Bavariousここではデリゲートを公開しません。 (私が別の質問であるべきかどうか) '[connection release];を追加するとエラーが表示され、削除すると消えます。 –
@Bavariousまた、エラー文法は、リリースされた 'NSURLConnection'インスタンスでメソッド' releaseDelegate'が呼び出されたことを示唆しています。代理人ではありません。 –