美文网首页
[iOS] AFN 封装时的内存泄露

[iOS] AFN 封装时的内存泄露

作者: manajay | 来源:发表于2018-05-31 21:56 被阅读77次

AFHTTPSessionManager 引起的泄露, 不适用单例的情况下, 经常会造成每次发起请求,实例化 AFHTTPSessionManager , 且没有释放的问题

AFURLSessionManager实现了NSURLSession的协议,即AFURLSessionManager和NSURLSession互相持有,如果这个delegate是week的话,那没什么问题,但是系统提供的是retain:

AFHTTPBodyPart AFMultipartBodyStream 泄露

HTTP2.png image.png image.png image.png image.png image.png image.png dd

POST 上传时, 如果拼接 Data 使用路径的方式, 不会导致泄露

fileURL的方式 bodyPart.body = fileURL;

- (BOOL)appendPartWithFileURL:(NSURL *)fileURL
                         name:(NSString *)name
                     fileName:(NSString *)fileName
                     mimeType:(NSString *)mimeType
                        error:(NSError * __autoreleasing *)error
{
    NSParameterAssert(fileURL);
    NSParameterAssert(name);
    NSParameterAssert(fileName);
    NSParameterAssert(mimeType);

    if (![fileURL isFileURL]) {
        NSDictionary *userInfo = @{NSLocalizedFailureReasonErrorKey: NSLocalizedStringFromTable(@"Expected URL to be a file URL", @"AFNetworking", nil)};
        if (error) {
            *error = [[NSError alloc] initWithDomain:AFURLRequestSerializationErrorDomain code:NSURLErrorBadURL userInfo:userInfo];
        }

        return NO;
    } else if ([fileURL checkResourceIsReachableAndReturnError:error] == NO) {
        NSDictionary *userInfo = @{NSLocalizedFailureReasonErrorKey: NSLocalizedStringFromTable(@"File URL not reachable.", @"AFNetworking", nil)};
        if (error) {
            *error = [[NSError alloc] initWithDomain:AFURLRequestSerializationErrorDomain code:NSURLErrorBadURL userInfo:userInfo];
        }

        return NO;
    }

    NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:[fileURL path] error:error];
    if (!fileAttributes) {
        return NO;
    }

    NSMutableDictionary *mutableHeaders = [NSMutableDictionary dictionary];
    [mutableHeaders setValue:[NSString stringWithFormat:@"form-data; name=\"%@\"; filename=\"%@\"", name, fileName] forKey:@"Content-Disposition"];
    [mutableHeaders setValue:mimeType forKey:@"Content-Type"];

    AFHTTPBodyPart *bodyPart = [[AFHTTPBodyPart alloc] init];
    bodyPart.stringEncoding = self.stringEncoding;
    bodyPart.headers = mutableHeaders;
    bodyPart.boundary = self.boundary;
    bodyPart.body = fileURL;
    bodyPart.bodyContentLength = [fileAttributes[NSFileSize] unsignedLongLongValue];
    [self.bodyStream appendHTTPBodyPart:bodyPart];

    return YES;
}

NSData的方式 bodyPart.body = body;

- (void)appendPartWithHeaders:(NSDictionary *)headers
                         body:(NSData *)body
{
    NSParameterAssert(body);

    AFHTTPBodyPart *bodyPart = [[AFHTTPBodyPart alloc] init];
    bodyPart.stringEncoding = self.stringEncoding;
    bodyPart.headers = headers;
    bodyPart.boundary = self.boundary;
    bodyPart.bodyContentLength = [body length];
    bodyPart.body = body;

    [self.bodyStream appendHTTPBodyPart:bodyPart];
}

测试猿题库的 YTKNetwork

image.png

Bug 依然存在, 所以还是 AFNetwork 的 问题

相关文章

  • [iOS] AFN 封装时的内存泄露

    AFHTTPSessionManager 引起的泄露, 不适用单例的情况下, 经常会造成每次发起请求,实例化 ...

  • 性能优化

    1,通过leak查看是否有内存泄露,(发现afn导致的内存泄露,原因,AFNManager对象多次创建,解决方案,...

  • 分享:在iOS上自动检测内存泄露

    分享:在iOS上自动检测内存泄露 分享:在iOS上自动检测内存泄露

  • 内存泄漏/管理

    ARC 下内存泄露的那些点performSelector延时调用导致的内存泄露iOS ARC下几种导致内存泄露的场...

  • iOS-网络相关

    本篇涵盖AFN、ASI、封装网络请求等. 1.iOS网络请求之ASI与AFN的二次封装及意义2.LXNetwork...

  • iOS网络框架简单封装

    AFN 简单封装--iOS重构-轻量级的网络请求封装实践 YTKNetworking 网络框架封装源码解析:网络层...

  • 最简单的iOS网络请求

    做iOS开发,说到网络请求,大家可能都不约而同的提到AFN,可以说大家的网络请求都是用AFN封装而成,AFN的强大...

  • 记一次内存泄露优化

    前言 dialog引起的内存泄露 最近在优化项目发现好几个地方出现了内存泄露 我封装了一个TipDialog,用在...

  • [iOS] 架构之网络

    网络封装的方案 参考文章 iOS应用架构谈 网络层设计方案 CBNetworking AFN 的封装,别出心裁 抛...

  • 【转载】 谈谈iOS内存泄露

    谈谈iOS内存泄露 来自:ScorpioLin 作者:简幽

网友评论

      本文标题:[iOS] AFN 封装时的内存泄露

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