私はしばらく同じプロジェクトに取り組んできましたが、Objective-CとCocoaについての私の理解は少しずつ進化してきました。コードのいくつかの部分を振り返ると、次のようになります。
__weak ASIFormDataRequest *serverQueueRequest = [ASIFormDataRequest requestWithURL:url2];
[serverQueueRequest setCompletionBlock:^{
NSLog(@"%@", serverQueueRequest.responseString);
}];
[serverQueueRequest startAsynchronous];
そして、それが私がすべてのサーバー要求を処理してきた方法です。これは、「リクエストをブロックでキャプチャすると保持サイクルにつながる可能性がある」という警告を抑制するために行ったと思います。それで私はそれを弱くしました、そしてそれは私のすべての問題を解決したようです。私はこれに関する実際の問題に気づいていません。
しかし、今コードを見ると、それが機能するのは少し奇妙に思えます。リクエストをと宣言すると__weak
、誰もそれを保持していないので、すぐにゼロにするべきではありませんか?このコードが機能するのはなぜですか?
また、このコードは機能しますが、機能しないケースを最近発見しました。このコードを含むメソッドを連続して数回、たとえば1秒間に5回呼び出すと、3/5のリクエストがNULL
応答します。 。これは一貫して当てはまります。__weak
修飾子を削除すると、この問題が解決します。その説明は何ですか?
そして最後に、このようなローカルリクエストを宣言する正しい方法は何ですか?
更新:この質問によると、それを行う正しい方法は次のようになります:
ASIHTTPRequest *_request = [[ASIHTTPRequest alloc] initWithURL:...
__weak ASIHTTPRequest *request = _request;
編集:実際には、上記の修正では、コードを5回呼び出すとNULL応答が発生する問題は修正されません。その問題はまだ存在します。問題が解決する唯一の方法は、リクエストを強力にキャプチャし、修飾子を使用しないことです。
ここで問題は、なぜ私の元のコードがまだ機能したのかということです。