我有一个长期开放的应用程序,使用AFNetworking 2.5.0对服务器进行周期性的API调用。在iOS 8.x上,我看到每个API调用都会增加永久内存,最终导致内存崩溃。
我把所有的代码都煮掉了,只使用了AFNetworking (以及下面的iOS ),并且仍然看到了内存的增长。下面是一个非常基本的示例,它将重新创建我所看到的内容:启动应用程序并开始使用HTTP。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.manager = [AFHTTPRequestOperationManager manager];
// Don't block out text/html extensions, for this example.
_manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
_manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html", nil];
[self getApiLoop];
return YES;
}
- (void) getApiLoop {
[_manager GET:@"http://www.stackoverflow.com" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"Success!");
// Do it again
dispatch_async(dispatch_get_main_queue(), ^{
[self getApiLoop];
});
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Failure!");
// Do it again
dispatch_async(dispatch_get_main_queue(), ^{
[self getApiLoop];
});
}];
}我在iOS 7.0上运行了相同的示例,没有看到这种类型的失控内存增长。
仪器显示,CFNetworking在运行中,并没有释放一些内存。
有什么解决办法吗?我们需要向苹果提交一个bug吗?
发布于 2014-11-26 22:56:22
我找到了一个适合我的代码库的解决方案,很乐意与大家分享。
AFNetworking 2.x有两个入口点:
我的应用程序需要iOS 6和更高版本,所以我开始使用AFHTTPRequestOperationManager.m。不幸的是,AFHTTPRequestOperationManager.m在iOS 8上显示内存问题,而AFHTTPSessionManager.m不显示(!)。不幸的是,这两个管理人员的软件API完全不同。
我的解决方案是在AFNetworking和我的应用程序的其他部分之间构建一个抽象层,这对我来说有两个目的:一个在iOS 6上工作、不会在iOS 8上占用内存的应用程序;以及一个抽象层,它可以防止我的团队在每次AFNetworking更改时都必须编辑整个应用程序的每个API调用。
我的应用程序不一定需要访问AFNetworking提供的全部功能,所以我只实现了我所需要的:
AFNetworking之上的抽象层的一个优点是,开发人员可以有效地在底层应用于AFNetworking的更改中传递信息。例如,当AFNetworking从1.x迁移到2.x时,每个人的应用程序都需要进行大量的代码重做,以便与新的API保持一致。有了抽象层,您可以选择在转换新的AFNetworking API时保持应用程序API的一致性,从而加快开发速度。
我在Apache2.0许可证下共享了我的代码:
https://stackoverflow.com/questions/27023962
复制相似问题