美文网首页
[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 封装时的内存泄露

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