iOS AFHTTPSessionManager内存泄漏解决方案

2021-06-08  本文已影响0人  guoguojianshu

第一种方案:把该manager封装成单例

方案代码

static AFHTTPSessionManager *manager;

/* 封装成 单例会话管理者 */
+ (AFHTTPSessionManager *)sharedManager {
    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        // 初始化请求管理类
        manager = [AFHTTPSessionManager manager];
        manager.requestSerializer = [AFJSONRequestSerializer serializer];
        
        // 设置15秒超时 - 取消请求
        manager.requestSerializer.timeoutInterval = 15.0;
        // 编码
        manager.requestSerializer.stringEncoding = NSUTF8StringEncoding;
        // 缓存策略
        manager.requestSerializer.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
        
        manager.responseSerializer = [AFJSONResponseSerializer serializer];
        // 支持内容格式
        manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/plain", @"text/javascript", @"text/json", @"text/html", nil];
    });
    return manager;
}

问题:很明显,同一时刻只能有一个网络请求。异步会有问题。当两个线程同时申请manager对象时,肯定有一个manager申请不到,无法网络请求

第二种方案:在网络请求的block内把task取消掉

无论是success,还是failure的回调都取消掉,当然在block外部需要弱化一下manager对象

__weak typeof(manager) weakManager = manager;

然后在两个回调方法里加上

[weakManager invalidateSessionCancelingTasks:YES];
上一篇 下一篇

猜你喜欢

热点阅读