2

次のように、オブジェクトへの参照をインスタンス変数に保持せずNSURLConnectionに、非同期リクエストでオブジェクトを作成できますか?applicationDidFinishLaunching:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    NSURLConnection *localVariable = [[NSURLConnection alloc] initWithRequest:req delegate:self];
}

ARCを使用していない場合、これは機能するはずです。オブジェクトへの参照はもうありませんが、保持カウントが +1 で終了するためNSURLConnection、 のようなデリゲート メソッドの 1 つでオブジェクトを解放するまで、オブジェクトはその役割を果たし、割り当て解除されません。connectionDidFinishLoading:applicationDidFinishLaunching:

ただし、問題は次のとおりです。これは悪いスタイルと見なされますか? この種のオブジェクト関係でインスタンス変数を常に維持する必要がありますか? これを ARC で機能させるにはどうすればよいですか? 結局、localVariable範囲外になると、ARC は myNSURLConnectionの割り当てを解除するのではないかと思います。

4

1 に答える 1

4

これに関する公式の参照は見つかりませんでしたが、NSURLConnectioncreated withinitWithRequestはそれ自体への強い参照を保持して、割り当てが解除されるのを防いでいるようです。この参照は、最後のデリゲート関数が呼び出された後、または接続がキャンセルされた後にのみ削除されます。

(たとえば、 NSURLConnectionまたはhttp://www.cocoabuilder.com/archive/cocoa/110116-nsurlconnection-retaincount-at-initialisation.htmlの保持カウントについて少し混乱していることを参照してください)

したがって、コードは ARC でも機能しますlocalVariable。接続が「アクティブ」である限り、スコープ外に出ても、接続への別の参照があります。

これは、接続への参照を保持する必要がないことを意味します。ただし、必要に応じて接続をキャンセルできるので便利です。

于 2012-11-26T09:04:41.210 に答える