在xcode仪器中,我得到了这个方法内存泄漏。
- (void)getDataForRequest:(NSURLRequest *)request completionHandler:(downloadCompletionBlock)completionHandler
{
self.expectedLength = 0;
self.currentLength = 0;
self.responseData = Nil;
self.contentLengthBlock = nil;
self.completionBlock = completionHandler;
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
session = [NSURLSession sessionWithConfiguration:defaultConfigObject delegate: self delegateQueue: [NSOperationQueue mainQueue]];
self.postDataTask = [session dataTaskWithRequest:request];
[self.postDataTask resume];
}
发布于 2020-07-20 17:37:41
这个代码片段中的一个问题是,您正在为每个请求创建一个新的NSURLSession
,并且您从未使会话无效。如果在请求启动后调用finishTasksAndInvalidate
,它将:
当请求完成时,
NSURLSession
关联的内存;通过这样做,delegate
对象的强引用。因此:
- (void)getDataForRequest:(NSURLRequest *)request completionHandler:(DownloadCompletionBlock)completionHandler {
self.expectedLength = 0;
self.currentLength = 0;
self.responseData = nil;
self.contentLengthBlock = nil;
self.completionBlock = completionHandler;
NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:defaultConfigObject delegate:self delegateQueue:[NSOperationQueue mainQueue]];
self.postDataTask = [session dataTaskWithRequest:request];
[self.postDataTask resume];
[session finishTasksAndInvalidate];
}
如果不使用finishTasksAndInvalidate
,就会看到这样的漏洞:
调用finishTasksAndInvalidate
将解决这些问题。
发布于 2020-07-20 13:48:29
问题可能是短语delegate: self
。NSURLSession保留其委托。因此,您告诉会话保留此实例(可能是视图控制器)。在使会话无效之前,视图控制器不能退出。
解决方案是:正确管理您的会话。保持对会话的引用,以便以后可以使其无效。更好的是,使委托成为一个轻量级对象,与可以管理其内存的视图控制器不同。
https://stackoverflow.com/questions/62995090
复制相似问题