2016-06-28 22 views
2

當我在NSURLSession上使用dataTaskWithRequest:completionHandler: API時,我是否必須保留對返回的任務的強烈引用,以便在完成之前不會釋放它,或者系統是否保留它直到它完成?我是否必須使用完成處理程序來維護對NSURLSessionDataTask的強引用?

例如,這是正確的:

[[[NSURLSession sharedSession] dataTaskWithRequest:myRequest completionHandler: 
    ^(NSURLResponse *resp, NSData *data, NSError *err) 
    { 
    //do something with the response/data/error 
    }] resume]; 

還是做我必須做這樣的事情:

//assume self.task is a retained property, and is set to nil in dealloc 
self.task = [[NSURLSession sharedSession] dataTaskWithRequest:myRequest completionHandler: 
    ^(NSURLResponse *resp, NSData *data, NSError *err) 
    { 
    //do something with the response/data/error 
    }]; 

[self.task resume]; 

我有一些代碼在生產第一種方法運行,我看到沒有崩潰因爲它,但它有時可能會默默地失敗,因爲任務在完成之前被autorelease池收集,因此永遠不會調用我的完成塊。

回答

2

其中的會話retains the tasks直到任務完成後(包括調用任何完成處理程序)。沒有必要自己保留它。

+0

在那個文檔鏈接中,你看到這個嗎?我沒有看到明確提到保留或釋放任務。 –

+0

重要提示:會話對象會保持對委託的強引用,直到您的應用程序明確地使會話失效。如果您不會使會話失效,您的應用程序會泄漏內存。 – dgatwood

+2

我知道它在那裏,因爲我寫了。 :-) – dgatwood

相關問題