美文网首页
iOS内存泄漏----通过Instruments排查AFNetw

iOS内存泄漏----通过Instruments排查AFNetw

作者: ZT_Story | 来源:发表于2019-09-25 17:49 被阅读0次

每次新项目结束后,发布前总是要进行内存泄漏和应用流畅度的检验
之前发现AFN在发起网络请求的时候会造成内存泄漏,所有实例的manager都不会自动释放
原因看了源码之后发现每次新建网络请求的时候都是重新创建manager

+ (instancetype)manager {
    return [[[self class] alloc] initWithBaseURL:nil];
}

我们常用的 AFHTTPRequestSerializerAFHTTPResponseSerializer 在创建的时候同样也是重新init

+ (instancetype)serializer {
    return [[self alloc] init];
}

之前底层封装网络请求类的时候每创建一个请求基本上都重新实例了一个AFHTTPSessionManager
查阅很多资料,关注了github上的issue,最后还是在官方Demo中找到答案
Demo中的网络请求封装类 AFAppDotNetAPIClient 继承了 AFHTTPSessionManager

#import <Foundation/Foundation.h>
@import AFNetworking;

@interface AFAppDotNetAPIClient : AFHTTPSessionManager

+ (instancetype)sharedClient;

@end

#import "AFAppDotNetAPIClient.h"

static NSString * const AFAppDotNetAPIBaseURLString = @"https://api.app.net/";

@implementation AFAppDotNetAPIClient

+ (instancetype)sharedClient {
    static AFAppDotNetAPIClient *_sharedClient = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _sharedClient = [[AFAppDotNetAPIClient alloc] initWithBaseURL:[NSURL URLWithString:AFAppDotNetAPIBaseURLString]];
        _sharedClient.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
    });
    
    return _sharedClient;
}

@end

做了单例的处理,保证每次都用同一个manager
自己对此也仿照做了单例的manager之后,再用Instruments检测就没有内存泄漏的问题了。


如果有小伙伴不清楚如何使用Instruments,那么可以去这个链接学习一下(图文教学,有利于新手上手)
iOS 使用Instruments工具检查内存泄漏问题

相关文章

网友评论

      本文标题:iOS内存泄漏----通过Instruments排查AFNetw

      本文链接:https://www.haomeiwen.com/subject/ajknectx.html