美文网首页
iOS AFHTTPSessionManager内存泄漏解决方案

iOS AFHTTPSessionManager内存泄漏解决方案

作者: guoguojianshu | 来源:发表于2021-06-08 09:33 被阅读0次

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

    • 解决理由:内存中的某一块固定的地址就用来存放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];
    

    相关文章

      网友评论

          本文标题:iOS AFHTTPSessionManager内存泄漏解决方案

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