我对AFNetworking有个问题。我正在通过GET从我的服务器请求大量的JSON数据:
[[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
接口代码:
@protocol RateRequestsDelegate;
@interface RateRequests : NSObject {
id<RateRequestsDelegate> _delegate;
}
@property (nonatomic, strong) id<RateRequestsDelegate> delegate;
- (void)fetchRateList;
@end
@protocol RateRequestsDelegate <NSObject>
- (void)receivedRateResponse:(NSDictionary *)response;
@endSessionResponseClient只是一个扩展的AFHtttpClient实例,正如所有AFNetworking示例所演示的,请参见:与API交互
receivedRateResponse的代码:
- (void)receivedRateResponse:(NSDictionary *)json {
if (!json) {
return;
}
self.moviesToInsert = [NSMutableArray arrayWithArray:[json objectForKey:@"rated"]];
[self.tableView reloadData];
}更新2
我现在将回调更改为一个基于块的函数,而不是使用委托,它有了一点改进,但它几乎没有提到,而且也可能是由其他一些东西的副作用引起的。你们是如何实现这一点的?尝试获取数据,将其显示在表或滚动视图中,然后从服务器多次提取这些数据并刷新视图。
非常感谢!保罗
发布于 2013-06-19 17:01:45
谢谢,伙计-我也有同样的问题-你的解决方案奏效了。
但是,我想我应该评论一下,在您的解决方案中,一旦收到内存警告,本质上就是关闭NSURLCache。我不确定AFNetworking是如何使用NSURLCache的,但我假设如果关闭它(即将其容量设置为0),它们的实现将不能有效地工作。这可能会减慢您的第一次内存警告后的请求速度。作为一个极端的边缘情况,您甚至可能会在使用应用程序的几天后遇到意想不到的行为,因为它可能在第一次内存警告之前才会显现出来。
相反,我建议实现一些移除缓存响应但使缓存保持活动的东西:
-(void)didReceiveMemoryWarning
{
[[NSURLCache sharedURLCache] removeAllCachedResponses];
}唯一的问题是AFNetworking可能需要再次构建它的缓存,但我假设这不会对框架产生很大的影响。
最后,万一它对您或任何人有用-为了将您自己的方法注册到内存警告通知,您可以这样做:
[[NSNotificationCenter defaultCenter] addObserver:self (or pointer to your singleton)
selector:@selector(myMethod)
name:UIApplicationDidReceiveMemoryWarningNotification
object:nil];我希望这能帮上忙!
发布于 2013-06-04 14:00:33
好的,解决方案是CFData (store)似乎负责在使用NSURLConnection的时候将url缓存保存在内存中。
所以我只需要打电话..。
NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];...to清除缓存,一旦收到内存警告.
或者你可以随时调用它(虽然不是时间概要函数).
希望这能帮助遇到类似问题的人。
发布于 2015-06-16 01:45:50
也许你可以试试“自动释放池”。例如:
@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
}https://stackoverflow.com/questions/16901336
复制相似问题