Instruments检测解决iOS内存泄露

前言就不过多阐述了,直接进主题

  1. 第一步打开自带的Instruments,如下
    这里写图片描述

  2. 第二步选择Leaks,让程序运行起来,点击应用就会检查是否有内存泄漏,如下图所示
    这里写图片描述

  3. 第三步就是针对第二步来做相对应处理,找到是哪里发生了内存泄漏,如图进行设置
    这里写图片描述

    这里写图片描述

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,发现内存泄漏原因是对象没有销毁
这里写图片描述

所以每次调用完直接释放掉即可,,还有一种方法是设置对象单例,只创建一次

猜你喜欢

转载自blog.csdn.net/JSON_6/article/details/76977553