2017-02-13 52 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。谢谢。 –