有关AFN的内存问题

通过Instrument检查到是由于AFNetworking这个库导致的内存泄漏,解决方法就是: 

将AFHTTPSessionManager的实例使用单例模式获取。

原先在网络请求类中获取AFHTTPSessionManager是通过如下方法

AFHTTPSessionManager*manager = [[AFHTTPSessionManageralloc]initWithBaseURL:[NSURLURLWithString:@""]];

此方法就是导致内存泄漏的罪魁祸首,所以需要用单例获取AFHTTPSessionManager对象。

在AFHTTPSessionManager类中添加单例:

staticAFHTTPSessionManager*manager;

+(AFHTTPSessionManager*)sharedHttpSessionManager {

staticdispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

manager = [AFHTTPSessionManagermanager];

manager.requestSerializer.timeoutInterval=10.0;

});

returnmanager;

}

AFHTTPSessionManager*manager =[[AFHTTPSessionManagersharedHttpSessionManager]initWithBaseURL:[NSURLURLWithString:@""]];

或AFHTTPSessionManager*manager = [类名 sharedHttpSessionManager];


 AFNetworking,处理数据出现Error Domain=NSCocoaErrorDomain Code=3840

原因在于出现特殊字符是AFNetworking无法解析的,会直接报错,那么当你在发Post请求时,返回结果会直接进如Fail代码块,其实在Fail中用Operation的NSString可以直接输出接收到的数据,是String,可以清楚的看到服务器端数据有哪些含有特殊字符,但是有一些字符是不好看到的,比如“Tab”键打出的那种四个空格,项目中用户有时候很常用到Tab键,最好的方法是在AFNetworking源码中添加字符过滤功能。

处理办法:找到AFNetworking包中AFURLResponseSerialization.m文件,大概在第250行左右添加如下过滤方法:

BOOLisSpace = [data isEqualToData:[NSDatadataWithBytes:" "length:1]];

if(data.length>0&& !isSpace) {

    NSString* sInvalid = [NSStringstringWithUTF8String:[data bytes]]; 

    // 从服务器收到的类似上一行的数据

    NSData*dataa = [[sInvalid stringByReplacingOccurrencesOfString:@"\r\n"withString:@"\\r\\n"] dataUsingEncoding:NSUTF8StringEncoding];

     responseObject = [NSJSONSerializationJSONObjectWithData:dataa options:self.readingOptionserror:&serializationError];

}else{

    returnnil;

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容