首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AFNetworking CFData泄密?

AFNetworking CFData泄密?
EN

Stack Overflow用户
提问于 2013-06-03 16:21:00
回答 3查看 1.4K关注 0票数 3

我对AFNetworking有个问题。我正在通过GET从我的服务器请求大量的JSON数据:

代码语言:javascript
复制
[[SessionResponseClient sharedClient] getPath:kURIRateList parameters:@{...} success:^(AFHTTPRequestOperation *operation, id JSON) {

    [_delegate receivedRateResponse:JSON];

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    [_delegate receivedRateResponse:nil];
}];

当它被调用10-20次时,CFData似乎占用了我应用程序的大部分内存。

内存使用

当我同时调查CFData和CFData (商店)时,我得到以下信息:

CFData (商店)

CFData

附带注意:我的应用程序正在使用ARC,其他功能似乎都很好。

我现在的问题是,由于我没有在AFNetworking的GitHub页面上看到任何悬而未决的问题,而且在互联网上也几乎没有其他关于这个问题的抱怨,我到底做错了什么?是面临这个问题的其他人,还是我是唯一一个?请你把你的代码,因为我不认为我的代码看起来是错误的..。

更新1

接口代码:

代码语言:javascript
复制
@protocol RateRequestsDelegate;

@interface RateRequests : NSObject  {
   id<RateRequestsDelegate>  _delegate;
}
@property (nonatomic, strong) id<RateRequestsDelegate> delegate;
- (void)fetchRateList;
@end

@protocol RateRequestsDelegate <NSObject>
- (void)receivedRateResponse:(NSDictionary *)response;
@end

SessionResponseClient只是一个扩展的AFHtttpClient实例,正如所有AFNetworking示例所演示的,请参见:与API交互

receivedRateResponse的代码:

代码语言:javascript
复制
- (void)receivedRateResponse:(NSDictionary *)json {
  if (!json)    {
    return;
  }

  self.moviesToInsert = [NSMutableArray arrayWithArray:[json objectForKey:@"rated"]];

  [self.tableView reloadData];
}

更新2

我现在将回调更改为一个基于块的函数,而不是使用委托,它有了一点改进,但它几乎没有提到,而且也可能是由其他一些东西的副作用引起的。你们是如何实现这一点的?尝试获取数据,将其显示在表或滚动视图中,然后从服务器多次提取这些数据并刷新视图。

非常感谢!保罗

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-19 17:01:45

谢谢,伙计-我也有同样的问题-你的解决方案奏效了。

但是,我想我应该评论一下,在您的解决方案中,一旦收到内存警告,本质上就是关闭NSURLCache。我不确定AFNetworking是如何使用NSURLCache的,但我假设如果关闭它(即将其容量设置为0),它们的实现将不能有效地工作。这可能会减慢您的第一次内存警告后的请求速度。作为一个极端的边缘情况,您甚至可能会在使用应用程序的几天后遇到意想不到的行为,因为它可能在第一次内存警告之前才会显现出来。

相反,我建议实现一些移除缓存响应但使缓存保持活动的东西:

代码语言:javascript
复制
-(void)didReceiveMemoryWarning
{
    [[NSURLCache sharedURLCache] removeAllCachedResponses];
}

唯一的问题是AFNetworking可能需要再次构建它的缓存,但我假设这不会对框架产生很大的影响。

最后,万一它对您或任何人有用-为了将您自己的方法注册到内存警告通知,您可以这样做:

代码语言:javascript
复制
[[NSNotificationCenter defaultCenter] addObserver:self (or pointer to your singleton)
                                         selector:@selector(myMethod)
                                             name:UIApplicationDidReceiveMemoryWarningNotification
                                           object:nil];

我希望这能帮上忙!

票数 2
EN

Stack Overflow用户

发布于 2013-06-04 14:00:33

好的,解决方案是CFData (store)似乎负责在使用NSURLConnection的时候将url缓存保存在内存中。

所以我只需要打电话..。

代码语言:javascript
复制
NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];

...to清除缓存,一旦收到内存警告.

或者你可以随时调用它(虽然不是时间概要函数).

希望这能帮助遇到类似问题的人。

票数 1
EN

Stack Overflow用户

发布于 2015-06-16 01:45:50

也许你可以试试“自动释放池”。例如:

代码语言:javascript
复制
@autoreleasepool {

// your codes below
[[SessionResponseClient sharedClient] getPath:kURIRateList parameters:@{...} success:^(AFHTTPRequestOperation *operation, id JSON) {

    [_delegate receivedRateResponse:JSON];

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    [_delegate receivedRateResponse:nil];
}];
// your codes above

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

https://stackoverflow.com/questions/16901336

复制
相关文章

相似问题

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