Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS 8.x+;网络内存增长_Ios_Afnetworking_Afnetworking 2 - Fatal编程技术网

iOS 8.x+;网络内存增长

iOS 8.x+;网络内存增长,ios,afnetworking,afnetworking-2,Ios,Afnetworking,Afnetworking 2,我有一个长期开放的应用程序,使用AFNetworking 2.5.0定期对我们的服务器进行API调用。在iOS 8.x上,我看到每次API调用都会带来永久内存增长,最终导致内存不足崩溃 我把所有的代码都用在了AFNetworking(以及下面的iOS)上,但仍然看到了内存的增长。下面是一个非常基本的示例,它将重新创建我看到的内容:启动应用程序并开始使用HTTP GET - (BOOL)application:(UIApplication *)application didFinishLaunch

我有一个长期开放的应用程序,使用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上运行了相同的示例,但没有看到这种失控的内存增长

仪器显示,CFC网络正在失效,不会释放一些内存


有解决办法吗?我们需要向苹果公司提交一个bug吗?

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

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上失去内存的应用程序;还有一个抽象层,它可以防止我的团队在每次网络更改时必须编辑整个应用程序中的每个API调用

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

  • initWithBaseURL
  • getResponseSerializer-(显式命名,以免混淆)
  • getRequestSerializer-(显式命名,以免混淆)
  • setResponseSerializer-(显式命名,以免混淆)
  • setRequestSerializer-(显式命名,以免混淆)
  • 使用setValue:forHTTPHeaderField设置标题:
  • 得到
  • 职位
  • 删除
  • 。。。以及取消操作的能力
AFNetworking上面的抽象层的一个优点是,开发人员可以有效地将应用于AFNetworking下面的更改打包。例如,随着AFNetworking从1.x迁移到2.x,每个人的应用程序都需要大量的代码返工,以与新的API保持一致。有了抽象层,您可以选择保持应用程序的API一致,同时在一个瓶颈处翻译新的AFNetworking API,从而加快开发

我已在Apache 2.0许可证下在以下位置共享了我的代码:


可能与此AFNetworking问题有关:请尝试其中提到的修复程序,看看是否有效。也会遇到类似的行为。重复使用AFN网络呼叫导致的OOM错误。