gpt4 book ai didi

iOS 8.x + AFNetworking 内存增长

转载 作者:行者123 更新时间:2023-12-01 18:56:05 25 4
gpt4 key购买 nike

我有一个长时间保持打开状态的应用程序,使用 AFNetworking 2.5.0 对我们的服务器进行定期 API 调用。在 iOS 8.x 上,我看到每次 API 调用都会导致内存永久增长,最终导致内存不足崩溃。

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

- (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 上运行了相同的示例,并没有看到这种相同类型的失控内存增长。

Instruments 建议 CFNetworking 正在分配内存,而不是在下面释放一些内存。

任何解决方法?我们需要向 Apple 提交错误吗?

最佳答案

我找到了一个适用于我的代码库的解决方案,很高兴分享它。

AFNetworking 2.x 有 2 个入口点:

  • 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:
  • 设置 header
  • 获取
  • 发布
  • 删除
  • ...以及取消操作的能力

  • AFNetworking 之上的抽象层的一个优点是开发人员可以有效地编码应用于下面的 AFNetworking 的更改。例如,随着 AFNetworking 从 1.x 迁移到 2.x,每个人的应用程序都需要进行大量的代码返工,以与新的 API 保持一致。通过抽象层,您可以选择保持应用程序的 API 一致,同时在一个瓶颈处转换新的 AFNetworking API,从而加快开发速度。

    我在 Apache 2.0 许可下共享了我的代码:

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

    关于iOS 8.x + AFNetworking 内存增长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27023962/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com