UITableCell AccessoryView:设置 accessoryView 等于 UIImageView 无限循环

UITableCell AccessoryView: Setting accessoryView equal to UIImageView infinite loop

编辑:我自己找到了答案,但这里是给任何需要它的人的: 无法共享 UIImageView,因此每个可见单元格都需要对每个 UIImageView 进行不同的实例化。现在你知道了。

我有一个自定义 table,它有 2 种类型的细胞。一个单元格仅设置为在复选标记类型的普通附件之间切换。另一个单元格设置为具有自定义图像作为附件类型。当 selected 时,附件图像变为相反的类型,显示 "Invited" 或 "Invite" 消息。

我已将错误代码缩小为以下代码,在我的 tableView:cellForRowAtIndexPath 委托方法中找到。

if(indexPath.section == 0){
    cell = [tableView dequeueReusableCellWithIdentifier:self.directCellID];
    cellValue = [self.contactsUsingApp objectAtIndex:indexPath.row];
    cell.imageView.image = [self getContactImage:indexPath.row];
//vvvvvvvvvvvvvvvvv This is the section at fault vvvvvvvvvvvvvvvvv
    if([self.selectedContactsUsingApp containsObject:indexPath])
        cell.accessoryView = self.invitedStatus;
    else
        cell.accessoryView = self.notInvitedStatus;
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  
}

如果我注释掉该部分,我将不再有失控的内存使用(模拟器向我显示正在进行某种持续分配,它从 40Mb 开始后超过了 1.29Gb)但是,很明显,图片不再显示。

如果重要,UIImageViews 初始化如下:

UIImage *invite = [self imageWithImage:[UIImage imageNamed: @"invite_btn.png"] scaledToSize:CGSizeMake(40, 20)];
UIImage *invited = [self imageWithImage:[UIImage imageNamed: @"invited_btn.png"] scaledToSize:CGSizeMake(40, 20)];
self.notInvitedStatus = [[UIImageView alloc]initWithImage:invite];
self.invitedStatus = [[UIImageView alloc]initWithImage:invited];

(imageWithImage:scale 是一个函数,它 returns 将调整大小的图像调整为适当的比例以计算此处找到的视网膜:The simplest way to resize an UIImage?)

当我 select 其中一个单元格时会发生相同的冻结,因为我的 tableView:didSelectRowAtIndexPath 方法使用与初始化方法相同的切换逻辑。

帮忙?

我自己找到了答案,但这里是为任何需要它的人准备的:UIImageViews 不能共享,因此每个可见单元格都需要对每个 UIImageView 进行不同的实例化。现在你知道了。