2017-02-13 20 views
1

データをダウンロードするためのNSObjectクラス 'DataDownload_A'があります。私はNSURLSessionとNSURLSessionTaskを使用します。問題は、このオブジェクトをnilに設定すると、deallocが呼び出されないことです。私が最後の2行はコメント場合NSURLSessionTask再開が呼び出された場合、オブジェクト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]; 

そして:ここでDataDownload_Aのセグメントコードは 'self.task = [self.session dataTaskWithRequest:theRequest]を;' and '[self.task resume];'、deallocが呼び出されます。したがって、私はそれらを使用するときにいくつかの問題がなければならないと仮定します。私は '[self.task cancel]'、 'self.task = nil'、 '[self.session invalidateAndCancel];'と '[self.session resetWithCompletionHandler:nil];'オブジェクトをゼロにする前にしかし、助けてくれなかった。

誰も私が作ったミスを知っていますか?私に知らせることに感謝します。前もって感謝します。

+0

ええ、私の回答は削除されましたが、あなたの[タスクキャンセル]とタスク= nilはdeallocを呼び出す必要がありますが、あなたの "DataDownload_A" "DataDownload_A"呼び出し元のコードを投稿する必要があります。 –

+0

ありがとうございます。スニークやってみます。 –

答えて

2

URLSessionは、その代理人への強い参照を保持しているようです。私はURLSession上のドキュメントで、この行を見つけた:

重要:アプリケーションが明示的にセッションを無効にするまで、セッションオブジェクトは、デリゲート への強い参照を保持します。 セッションを無効にしないと、アプリがメモリをリークします。

そのビットはURLSessionのように聞こえますが、設定されてから無効になるまで、またはあなたのアプリが終了するまで、その代理人への強い参照が保持されますが、データ(または他の)タスクが開始されます。

URLSessionをデリゲートとしてリリースするには、URLSessionを無効にする必要があるようです。 XcodeのURLSession文書でそのテキストを検索することをお勧めします。 "無効"を検索する

+0

こんにちはダンカンC ..あなたの答えはかなり私の問題を解決するために近いと私のセッション変数をチェックするにはインスピレーションを受けた..私はセッションを無効にする前に私のオブジェクトを設定する前に無名...しかし、私のセッションは '保持'で設定されます。ので、 '強い'に戻って設定されて..それはdeallocに動作します。ありがとうございました。 –

関連する問題