3

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 (ストア)

CFデータストアメモリ

CFデータ

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;
@end

すべての AFNetworking の例が示すように、SessionResponseClient は単なる拡張された AFHtttpClient インスタンスです。以下を参照してください: API との対話

receivedRateResponse のコード:

- (void)receivedRateResponse:(NSDictionary *)json {
  if (!json)    {
    return;
  }

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

  [self.tableView reloadData];
}

更新 2

デリゲートを使用する代わりにコールバックをブロックベースの関数に変更したところ、少し改善されましたが、ほとんど言及できず、他の何かの副作用によって引き起こされる可能性もあります。皆さんはこれをどのように実装しますか?データをフェッチしてテーブルまたはスクロールビューに表示し、サーバーからこれらのデータを何度もプルしてビューを更新してみてください

どうもありがとう!ポール

4

3 に答える 3

1

さて、解決策は、CFData (store)を使用するときにメモリ内の URL キャッシュを保持する責任があるように思われることでしたNSURLConnection

だから私がしなければならなかったのは電話することだけでした...

NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];

...メモリ警告を受け取ったら、キャッシュをクリアするには...

または、必要なときにいつでも呼び出すことができます(ただし、その関数のプロファイルを作成していませんでした)...

これが、同様の問題に遭遇した人に役立つことを願っています。

于 2013-06-04T14:00:33.687 に答える
0

@autoreleasepool を試してみてください。例えば:

@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

}
于 2015-06-16T01:45:50.900 に答える