2012-12-11 23 views
0

我是Objective-c的新手。我寫了幾行代碼來異步訪問Web服務,然後處理結果。你能解釋一下當一個異步方法將委託(協議)作爲參數時,ARC如何工作?Objective-C異步方法和ARC

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

我不知道這種方法是有效的,因爲這是作爲結果返回隱含NSURLConnection

比如我通過一種方法使用本地NSURLConnection調用Web服務connectionWithRequest消息應該標記爲清理,因爲調用方法和委託都沒有引用它。但它的作品!

所以:

  1. 如何運行時不知道過早地擦拭出 NSURLConnection是在幹什麼工作的?
  2. 列表項目我是否應該在我的代理中釋放/關閉連接一次 connectionDidFinishLoading收到消息?
  3. 代表聲明invokeSomeWebServiceMethod並將self作爲connectionWithRequest消息的一部分聲明更有意義嗎?然後創建NSURLConnection被封裝在委託內。

感謝

回答

1
  1. 雖然連接下載,它保留本身。

  2. 如果您有任何強大的連接引用,則應在連接對象完成後將它們設置爲零。

  3. 要回答這個問題,我需要更多關於什麼MyDelegate真的是什麼東西以及當前託管什麼對象invokeSomeWebServiceMethod

你可以看一下在保持並啓用了「記錄的引用計數」的辦分配儀器在你的應用程序,「只跟蹤活動分配」禁用發佈自己:

allocations instrument options

然後,在Instrument下運行程序後,可以在搜索欄中鍵入「NSURLConnection」並單擊灰色圓圈中的小白色箭頭以查看單個對象的軌跡:

instruments history for one NSURLConnection

您可以在該屏幕截圖中看到(右鍵單擊並在全新尺寸的新選項卡中打開)-[NSURLConnectionInternal initWithInfo:]保留連接(第1行)。在連接完成發送其所有委託消息之後,該版本會在發佈後進行平衡。

+0

謝謝你,讓我玩/學習分配工具,並回來。 「 – hba

+0

」當連接正在下載時,它保留下來。「 - 這是否記錄在某處?我曾經討論過這個問題,但找不到參考。 –