2017-08-27 237 views
1

我有一个任务没有ARC。以前我没有使用它(最近开始研究ios开发)。我有一个表示http请求的类,它符合NSURLSessionDownloadDelegate协议。并且我还有以下代码:我是否需要使用委托释放对象?

-(void)executeWithRelativeUrl:(NSString *)relativeUrl andSuccessBlock: (void(^) (NSData*))successBlock { 
    NSURL *url = [[NSURL alloc] initWithString:relativeUrl relativeToURL:self.baseUrl]; 
    [self setSuccessBlock:successBlock]; 
    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url]; 
    NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; 
    NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration delegate:self delegateQueue:nil]; 
    NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithRequest:request]; 
    [downloadTask resume]; 

    [request release]; 
    [url release]; 
} 

创建网址会话并启动下载任务。我负责的任务结果在下面的方法:

-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location { 
    NSData *data = [NSData dataWithContentsOfURL:location]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     self.successBlock(data); 
    }); 

} 

现在的问题是:我需要在最后的方法结束时释放会话,下载任务和位置网址?或者它会为我完成?我问这是因为我在第一个方法中创建了它(除了url),并且据我了解,负责释放对象的人也是我。谢谢!

+0

这是更好,如果你有downloadTask作为属性或数组或者一些引用它,所以你可以取消它,如果你也需要它等 – 2017-08-27 22:46:53

回答

0

Golden Rule非常简单。你说alloccopyretain?没有?那么你不需要说release(你不能这样做)。

(你需要释放urlrequest出于这个原因,你正在这样做。所以,内存管理现在已经完成。)

+0

我说在第一种方法中,分配会话和下载任务。或者第二种方法中的对象是不一样的? – Yuuji

+0

您没有显示任何“分配”会话和下载任务的代码。那么你甚至在谈论什么? – matt

+0

啊...我没有明确的“初始化”。我现在知道了。非常感谢您的回答! – Yuuji

相关问题