首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS 8.x + AFNetworking内存增长

iOS 8.x + AFNetworking内存增长
EN

Stack Overflow用户
提问于 2014-11-19 18:11:13
回答 1查看 608关注 0票数 1

我有一个长期开放的应用程序,使用AFNetworking 2.5.0对服务器进行周期性的API调用。在iOS 8.x上,我看到每个API调用都会增加永久内存,最终导致内存崩溃。

我把所有的代码都煮掉了,只使用了AFNetworking (以及下面的iOS ),并且仍然看到了内存的增长。下面是一个非常基本的示例,它将重新创建我所看到的内容:启动应用程序并开始使用HTTP。

代码语言:javascript
复制
- (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吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-26 22:56:22

我找到了一个适合我的代码库的解决方案,很乐意与大家分享。

AFNetworking 2.x有两个入口点:

  • AFHTTPSessionManager.m -推荐用于针对iOS 7和iOS 8的应用程序
  • AFHTTPRequestOperationManager.m -推荐应用程序返回到iOS 6

我的应用程序需要iOS 6和更高版本,所以我开始使用AFHTTPRequestOperationManager.m。不幸的是,AFHTTPRequestOperationManager.m在iOS 8上显示内存问题,而AFHTTPSessionManager.m不显示(!)。不幸的是,这两个管理人员的软件API完全不同。

我的解决方案是在AFNetworking和我的应用程序的其他部分之间构建一个抽象层,这对我来说有两个目的:一个在iOS 6上工作、不会在iOS 8上占用内存的应用程序;以及一个抽象层,它可以防止我的团队在每次AFNetworking更改时都必须编辑整个应用程序的每个API调用。

我的应用程序不一定需要访问AFNetworking提供的全部功能,所以我只实现了我所需要的:

  • initWithBaseURL
  • getResponseSerializer -(显式命名这样我们就不会感到困惑)
  • getRequestSerializer -(显式命名这样我们就不会感到困惑)
  • setResponseSerializer -(显式命名这样我们就不会感到困惑)
  • setRequestSerializer -(显式命名这样我们就不会感到困惑)
  • 使用setValue:forHTTPHeaderField设置标题:
  • 到达
  • 帖子
  • 删除
  • ..。以及取消手术的能力

AFNetworking之上的抽象层的一个优点是,开发人员可以有效地在底层应用于AFNetworking的更改中传递信息。例如,当AFNetworking从1.x迁移到2.x时,每个人的应用程序都需要进行大量的代码重做,以便与新的API保持一致。有了抽象层,您可以选择在转换新的AFNetworking API时保持应用程序API的一致性,从而加快开发速度。

我在Apache2.0许可证下共享了我的代码:

https://github.com/eemoss/afnetworking-abstractionlayer-ios

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27023962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档