2016-01-29 201 views
1

我創建了一個NSURLSession對象,但沒有挽留它NSURLSession對象必須保留

{ 
    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 
    NSURLSession * session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil]; 
    NSURLSessionDataTask *task = [session dataTaskWithURL:[NSURL URLWithString:urlRequest]]; 

    [task resume]; 
} 

然後我實現了系統的代表:

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error 
{ 
    .... 
} 

- (void)URLSession:(NSURLSession *)session dataTask:(nonnull NSURLSessionDataTask *)dataTask didReceiveResponse:(nonnull NSURLResponse *)response completionHandler:(nonnull void (^)(NSURLSessionResponseDisposition))completionHandler 
{ 
    .... 
    completionHandler(....); 
} 

.... 

的代碼工作正常,沒有任何問題了。但我想知道系統調用委託之前會話對象是否可以解除分配?如果會話對象被釋放,代表會發生什麼?

在此先感謝。

回答

0

好吧,只要你在session有強烈的參考意見,顯然它不會釋放。

但我想你的擔心是如果session是一個局部變量,它超出了範圍。文檔不夠清晰,但是通過測試,我發現會話中保留着某種形式的自我引用來完成它的工作。

這是什麼發生然後變得有趣。如果你失去了對會議的參考,就像它只是本地會議,那麼我認爲無法再找到它。這可能是一個內存泄漏,它永遠保持不變但不可觸摸。我不太確定。然而這不是你想要做的。

有時候你想要在同一個會話中添加更多的任務,在這種情況下,你需要用一個屬性或某個東西來保持它,這樣你才能持久地獲得它。

有時你希望它在任務完成後消失。這可以使用方法-finishTasksAndInvalidate來實現,您可以在代碼中直接調用-resume。查看文檔,它將完成開始的任務,然後最終放棄代表和它本身。

一般來說,您要做的是確保永久使用會話,或者您在某處調用invalidate方法之一,請參閱班級文檔中的「管理會話」。