0

私はObjective-cが初めてです。Web サービスに非同期でアクセスし、結果を処理するコードを数行書きました。非同期メソッドがデリゲート (プロトコル) を引数として取る場合の ARC の動作について説明していただけますか?

たとえばNSURLConnection、メソッドでローカルを使用して Web サービスを呼び出しています。

-(void) invokeSomeWebServiceMethod {
   MyDelegate *const theDelegate = ...;
   NSURL *const url = ...;
   NSURLRequest *const request = ...;
   [NSURLConnection connectionWithReuqest: request delegate:theDelegate]; 
}

呼び出し元のメソッドもデリゲートもそれへの参照を持たないためNSURLConnection、メッセージの結果として返される暗黙的なものはクリーンアップ用にマークする必要があるため、このアプローチが機能するかどうかはわかりませんでした。connectionWithRequestしかし、それはうまくいきます!

そう:

  1. ランタイムは、作業を行っているものを時期尚早に消去しないことをどのように認識しています NSURLConnectionか?
  2. connectionDidFinishLoadingリスト項目メッセージが受信されたら、デリゲートで接続を解放/閉じる必要があり ますか?
  3. デリゲートが を宣言してメッセージの一部としてinvokeSomeWebServiceMethod渡す方が理にかなっていますか? 次に、の作成がデリゲート内にカプセル化されます。selfconnectionWithRequestNSURLConnection

ありがとう

4

1 に答える 1

1
  1. 接続がダウンロードされている間、接続は保持されます。

  2. 接続への強い参照がある場合は、接続オブジェクトの処理が完了したら、それらをnilに設定する必要があります。

  3. この質問に答えるにMyDelegateは、実際には何であり、現在どのオブジェクトがホストしているのかについての詳細情報が必要invokeSomeWebServiceMethodです。

「参照カウントの記録」を有効にし、「アクティブな割り当てのみを追跡する」を無効にして、割り当てインスツルメントでアプリを実行することにより、保持と解放を確認できます。

割り当て機器オプション

次に、Instrumentsでプログラムを実行した後、検索バーに「NSURLConnection」と入力し、灰色の円で囲まれた小さな白い矢印をクリックしてドリルダウンし、単一のオブジェクトのトレースを表示します。

1つのNSURLConnectionの機器履歴

そのスクリーンショット(右クリックしてフルサイズの新しいタブで開く)で-[NSURLConnectionInternal initWithInfo:]、接続を維持していることがわかります(1行目)。その保持は、接続がすべてのデリゲートメッセージの送信を終了した後のリリースによってバランスが取られます。

于 2012-12-11T03:50:20.987 に答える