1

私のiPhoneアプリケーションには、カスタムimageviewを備えたテーブルビューがあり、AsyncImageViewクラスを使用してリモートロケーションから画像をロードしています。うまく機能しますが、1つの問題は、テーブルをスクロールすると、セルがデキューされ、サーバーから画像を取得しようとすることです。そのため、AsyncImageViewクラスから画像を読み込むためのメソッドが何度も呼び出されるため、メモリ割り当てが増加し、最終的にアプリがクラッシュします。

これが私のコードです:

- (UITableViewCell *) getCellContentView:(NSString *)cellIdentifier {

    CGRect CellFrame = CGRectMake(0, 0, 300, 40);

    CGRect userImageFrame = CGRectMake(5, 7, 36, 36);

    UIImageView *userImage;

    UITableViewCell *cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];
    [cell setFrame:CellFrame];

    userImage = [[UIImageView alloc]init];
    userImage.frame = userImageFrame;
    userImage.tag = 3;
    [cell.contentView addSubview:userImage];
    [userImage release];

    return cell;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if(cell == nil)
        cell = [self getCellContentView:CellIdentifier];
    else
        [[AsyncImageLoader sharedLoader] cancelLoadingImagesForTarget:cell.imageView];

    UIImageView *userImage = (UIImageView *)[cell viewWithTag:3];

    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    cell.selectionStyle = UITableViewCellSelectionStyleGray;
    NSString *url = [[NSString alloc]initWithFormat:@"%@%@", CommonImageURL,[AllUsersProfileImageArray objectAtIndex:indexPath.row]];
    NSURL *imageUrl =  [NSURL URLWithString:[url stringByAppendingFormat:@"?%i", rand()]];
    [url release];

    userImage.image = [UIImage imageNamed:@"defaultPerson.png"];
    userImage.imageURL = imageUrl;
    return cell;
}

問題を解決するための可能な方法はありますか?助けてください。

4

4 に答える 4

2

最善の解決策は、すでにダウンロードされている画像をキャッシュし、そこから表示することです。

そのためのコードを書く必要があります。そうしないと、そのような機能を提供するライブラリがいくつかあります。

  1. HJCache
  2. SDWebImage
于 2013-01-04T06:00:34.657 に答える
1

人気のあるAFNetworkingライブラリには、見落とされがちなWebから画像を読み込むためのUIImageViewカテゴリも含まれています。メモリ使用量に関しては非常に効率的で使いやすいことがわかりました。

http://afnetworking.github.com/AFNetworking/Categories/UIImageView+AFNetworking.html

于 2013-01-04T07:21:29.570 に答える
0

サーバーから複数の画像をロードする際のメモリリークという同じ問題に遭遇しました。
  私のアプリケーションでは、非同期リクエストを使用してNSURLConnectionを使用していたときに、毎回新しい画像の応答が必要でした(機能係数) 。で試してみました

NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:0];
[NSURLCache setSharedURLCache:sharedCache]; // in DidFinishLoading & didFailWithError

receivedData=nil;  // at didReceiveResponse
receivedData=[[NSMutableData alloc] init];

しかし、cellForRowAtIndexPathのセルを削除 し、新しいNSURLリクエストごと[cell removeFromSuperview];にセル を再初期化するまで(cellForRowAtIndexPathの条件が追加されましたが、実際に効果がありました)、実際には何も役に立ちませんでした。

おそらく、UIImageViewsが削除されることはなく、応答によってフェッチされたときに新しい画像とデータが絶えず追加されていました。私の場合、新しいNSURLRequestの古いUITableViewCellを削除すると機能しました。
  これが私のような誰かがNSURLCacheのクリーニングで失われ、それでもメモリが強化されるのに役立つことを願っています。

于 2014-02-25T17:48:04.107 に答える
0

ここにカスタムソリューションを投稿しました 。非同期で画像をダウンロードします。

私はそれがうまく機能し、コードをほとんど必要としないと思います。

于 2014-03-06T09:55:48.217 に答える