UITableViewCellで非同期イメージをロードするときにハンギングする

私は最初のiOSアプリケーションをプログラミングしています。私はUITableViewCellに非同期で画像をロードしようとしています。バックグラウンドの画像をNSMutableArrayにロードします。このNSMutableArrayは、cellForRowAtIndexPathメソッドで取得されます。セルはイメージを読み込むことができますが、〜5番目のセルでクラッシュし、2つの異なるエラーの1つを示します。

ApplicationCell.mの@synthesize行のSIGABRTで、オブジェクト0x6c30e60のmalloc:
* エラー:double free

または単にgdbに入り、iconView.image = newIconをポイントします。 (スレッド1)。

私はテーブルビューコントローラの@interfaceにNSMutableArray *
imageArrayを宣言し、それを@propertyとして設定してから@ synthesize’dしました:

@synthesize searchArray;
...
- (void)viewDidLoad {
    [super viewDidLoad];
    ...
    self.imageArray = [[NSMutableArray alloc] initWithCapacity:8]; //<-- Am I doing this correctly?
    for (int i=0; i < 8; i++) {
        [self.imageArray addObject:[UIImage imageNamed:@"empty.png"]];
    }
    ...
}

背景に読み込まれる画像は最大8枚あり、imageArrayの中に配置されます:

- (void)requestFinishedImage:(ASIFormDataRequest*)request {
    //image request
    NSData *responseData = [request responseData];
    NSIndexPath *index = [NSIndexPath indexPathForRow:request.tag inSection:0];
    UIImage *image = [[UIImage alloc] initWithData:responseData];
    NSLog(@"requested Image with tag: %d",request.tag);
    [imageArray replaceObjectAtIndex:request.tag withObject:image];
    ApplicationCell *cell = (ApplicationCell *)[self.tableView cellForRowAtIndexPath:index];
    [cell setIcon2:image];
    cell.icon = image;
    [image release];
}

ここにcellForRowAtIndexPathがあります:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    ApplicationCell *cell = (ApplicationCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        [self.cellNib instantiateWithOwner:self options:nil];
        cell = tmpCell;
        self.tmpCell = nil;
    }
    UIImage *image;
    NSUInteger row = [indexPath row];

    [cell setItem2: [[searchArray objectAtIndex:row] objectForKey:@"item"]];
    [cell setPrice2: cell.price];
    image = [imageArray objectAtIndex:row];
    NSLog(@"num elements in imageArray = %d, loading: %d",[imageArray count], row);
    [cell setIcon2: image];
[image release];
    return cell;
}

そしてここに私のApplicationCell.hとApplicationCell.mがあります

#import 
#import 

@interface ApplicationCell : UITableViewCell
{

    UIImage *icon;
    NSString *item;
    NSString *price;
    IBOutlet UIImageView *iconView;
    IBOutlet UILabel *itemLabel;
    IBOutlet UILabel *priceLabel;
}
- (void)setIcon2:(UIImage *)newIcon;
- (void)setItem2:(NSString *)newItem;
- (void)setPrice2:(NSString *)newPrice;

@property(retain) UIImage *icon;
@property(retain) NSString *item;
@property(retain) NSString *price;

@end

ApplicationCell.m

#import "ApplicationCell.h"

@implementation ApplicationCell

@synthesize icon, item, price;

- (void)setIcon2:(UIImage *)newIcon
{
    [self setIcon:newIcon];
    iconView.opaque = YES;
    iconView.image = newIcon;
}
- (void)setItem2:(NSString *)newItem
{
    [self setItem:newItem];
    itemLabel.text = newItem;
}

- (void)setPrice2:(NSString *)newPrice
{
    [self setPrice:newPrice];
    priceLabel.text = newPrice;
}


- (void)dealloc
{
    [icon release];
    [item release];
    [price release];

    [iconView release];
    [itemLabel release];
    [priceLabel release];

    [super dealloc];
}

@end

iOSアプリケーションを試してみるのは初めてのことなので、おそらくコードに間違いがありますが、私に教えてください!私はあまりにも長いために、この非同期の読み込みの問題に立ち往生してきた..任意のヘルプが大歓迎です!

ベストアンサー

-tableView:cellForRowAtIndexPath:[image
release]

呼び出しを取り出します。あなたはそこにそれを保持しなかったので、あなたはそれを解放する必要はありません。
Xcodeのスタティックアナライザを使用すると、このようなメモリエラーが検出されます。

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です