在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];
}
最佳答案
此代码段中的问题是,您正在为每个请求创建一个新的NSURLSession
,并且您永远不会使 session 无效。如果在请求启动后调用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
将解决这些问题。
关于ios - NSURLSession的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62995090/