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池收集,因此永遠不會調用我的完成塊。
在那個文檔鏈接中,你看到這個嗎?我沒有看到明確提到保留或釋放任務。 –
重要提示:會話對象會保持對委託的強引用,直到您的應用程序明確地使會話失效。如果您不會使會話失效,您的應用程序會泄漏內存。 – dgatwood
我知道它在那裏,因爲我寫了。 :-) – dgatwood