2017-02-13 41 views
1

我有一個用於下載數據的NSObject類'DataDownload_A'。裏面我使用NSURLSession和NSURLSessionTask。現在的問題是,當我將這個對象設置爲零時,dealloc不會被調用。這裏是DataDownload_A的片段代碼:如果調用NSURLSessionTask resume,則不調用對象dealloc

NSString *urlString = [self URL]; 
    NSURL *url    = [NSURL URLWithString:urlString]; 
    NSURLRequest *theRequest = [NSURLRequest requestWithURL:url 
               cachePolicy:NSURLRequestUseProtocolCachePolicy 
              timeoutInterval:60.0]; 

    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 

    self.session = [NSURLSession sessionWithConfiguration:configuration 
               delegate:self 
              delegateQueue:nil]; 
    self.receivedData = [NSMutableData data]; 

    self.task = [self.session dataTaskWithRequest:theRequest]; 
    [self.task resume]; 

如果我評論的最後兩行 'self.task = [self.session dataTaskWithRequest:theRequest];'和'[self.task resume];',dealloc將被調用。因此,我認爲在使用它們時一定會有一些問題。我試圖調用'[self.task cancel]','self.task = nil','[self.session invalidateAndCancel];'和'[self.session resetWithCompletionHandler:nil];'在我將對象設置爲零之前。但沒有幫助。

因此,有誰知道我犯了什麼錯誤?將不勝感激,讓我知道。先謝謝你。

+0

嗯,我刪除了我的答案,但你的[任務取消]和任務=零,應調用dealloc,但似乎你可能有其他的東西保持強烈的引用你的「DataDownload_A」,你應該發佈你的「DataDownload_A」調用者的代碼。 – 2017-02-13 03:27:13

+0

謝謝。潛行。我會嘗試。 –

回答

2

它看起來像URLSession擁有強大的參考其代表。我發現在文檔此行URLSession

重要提示:會話對象保持較強的參考委託 ,直到您的應用程序會話明確無效。如果您不會使 使會話無效,那麼您的應用程序會泄漏內存。

這一點使得它聽起來像一個URLSession持有它的成立,直到它的失效或您的應用程序被終止的那一刻的強引用其委託的,但它可能是隻創建了一個有力的參考,當一個數據(或其他)任務開始。

聽起來好像你需要使URLSession無效才能讓它釋放它的委託。我建議在Xcode的URLSession文檔中搜索該文本。也搜索「無效」

+0

嗨鄧肯C ..你的答案是非常接近解決我的問題,並啓發我檢查我的會話變量..我確實呼籲會議無效之前將我的對象設置爲零...但我的會話設置爲'保留'。所以在設置回'strong'之後,它可以工作到dealloc。謝謝。 –