前言就不过多阐述了,直接进主题
第一步打开自带的Instruments,如下
第二步选择Leaks,让程序运行起来,点击应用就会检查是否有内存泄漏,如下图所示
第三步就是针对第二步来做相对应处理,找到是哪里发生了内存泄漏,如图进行设置
4:直接点击下面发生内存泄漏的地方,,就会直接跳转到对应的代码上,,我发生产生泄漏的地方是Afn框架造成的,然后针对Afn进行的追踪发现问题所在,修改如下即可
//获得请求管理者
AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];
//而finishTasksAndInvalidate方法,则会等待任务完成时将session释放,消除了循环引用。
//下面这句代码在请求失败和成功之后调用
[mgr.session finishTasksAndInvalidate];
分析:
第一步: 进入AFHTTPSessionManager的manager方法中看看
第二步: 找到源码的initWithSessionConfiguration方法进去
- (instancetype)initWithBaseURL:(NSURL *)url
sessionConfiguration:(NSURLSessionConfiguration *)configuration
{
self = [super initWithSessionConfiguration:configuration];
if (!self) {
return nil;
}
// Ensure terminal slash for baseURL path, so that NSURL +URLWithString:relativeToURL: works as expected
if ([[url path] length] > 0 && ![[url absoluteString] hasSuffix:@"/"]) {
url = [url URLByAppendingPathComponent:@""];
}
self.baseURL = url;
self.requestSerializer = [AFHTTPRequestSerializer serializer];
self.responseSerializer = [AFJSONResponseSerializer serializer];
return self;
}
第三步:在源码中发现这里用到了代理
//delegate 对象是AFURLSessionManager类 然后进入到这个类看看
self.session = [NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:self.operationQueue];
第四步,在往里追踪,发现代理属性为Retain,发现内存泄漏原因是对象没有销毁
所以每次调用完直接释放掉即可,,还有一种方法是设置对象单例,只创建一次