最近在写小项目的过程中发现app在运行过程中内存总是会增加,没有上限一样到五六十兆。然后本能的打开xcode的product--profile--leak 监测一下内存泄漏的地方。结果发生一堆内存泄漏,不过都是当我获取网络数据的时候。
点击leaks--calltree ,勾选右边设置的Invert Call Tree和Hide System Libraries 查看内存泄漏的位置 。
可以看到如下
可以看出内存泄漏全是和AFNetWorking 有关 ,原因是manager类每一次网络请求都是初始化一个实例对象,但是该对象在工程中得不到释放,造成了内存泄漏。我也不知道AFNetWorking的作者是怎么想的。解决方法是创建一个继承与AFHTTPSessionManager 的单例对象,每次网络请求都调用这个单例方法。
代码很简单 ,作为新手要记录每个错误。加油。
AFmanager.h中
import "AFHTTPSessionManager.h"
@interface AFmanager :AFHTTPSessionManager
+(AFHTTPSessionManager *)shareManager;
@end
AFmanager.m中
+(AFHTTPSessionManager *)shareManager {
staticAFHTTPSessionManager *manager=nil;
staticdispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
manager = [AFHTTPSessionManagermanager];
// manager.requestSerializer = [AFJSONRequestSerializer serializer];
// manager.responseSerializer = [AFJSONResponseSerializer serializer];
});
return manager;
}
(将AFmanager.h 头文件写在pch文件中)在网络请求调用的地方
AFHTTPSessionManager *manager = [AFmanagermanager];
完成后,一切搞定。又少了一个坑。