UILabel 错误释放到 UITableViewCell

Posted

技术标签:

【中文标题】UILabel 错误释放到 UITableViewCell【英文标题】:UILabel wrong release into UITableViewCell 【发布时间】:2011-07-16 09:48:19 【问题描述】:

我有一个这样的自定义 UITableViewCel:

@synthesize poiNameLabel;
@synthesize poiDistanceLabel;

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
    if ((self = [super initWithStyle:style reuseIdentifier:reuseIdentifier])) 
        // Initialization code
        CGRect nlabelframe = CGRectMake(NAMELABEL_X, NAMELABEL_Y, NAMELABEL_WIDTH, NAMELABEL_HEIGHT);
        UILabel *nlabel = [[UILabel alloc] initWithFrame:nlabelframe];
        nlabel.font = [UIFont fontWithName:@"Arial" size:NAMELABEL_FONT];
        nlabel.backgroundColor = [UIColor clearColor];
        nlabel.minimumFontSize = NAMELABEL_FONT_MIN;
        //nlabel.adjustsFontSizeToFitWidth = YES;
        [self addSubview:nlabel];
        self.poiNameLabel = nlabel;
        [nlabel release];

        CGRect dlabelframe = CGRectMake(DISTANCELABEL_X, DISTANCELABEL_Y, DISTANCELABEL_WIDTH, DISTANCELABEL_HEIGHT);
        UILabel *dlabel = [[UILabel alloc] initWithFrame:dlabelframe];
        dlabel.font = [UIFont fontWithName:@"Arial" size:DISTANCELABEL_FONT];
        dlabel.backgroundColor = [UIColor clearColor];
        dlabel.minimumFontSize = DISTANCELABEL_FONT_MIN;
        dlabel.adjustsFontSizeToFitWidth = YES;
        [self addSubview:dlabel];
        self.poiDistanceLabel = dlabel;
        [dlabel release];

        self.contentView.backgroundColor = [UIColor clearColor];
        self.contentView.opaque = NO;

    
    return self;



- (void)setSelected:(BOOL)selected animated:(BOOL)animated 

    [super setSelected:selected animated:animated];



- (void)dealloc 
    [super dealloc];
    [poiNameLabel release];
    [poiDistanceLabel release];

我就是这样填写的:

NSDictionary *dic = [[NSDictionary alloc] initWithDictionary:[poisSource objectAtIndex:row]];
ResultsViewCell *cell = [[[ResultsViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
cell.poiNameLabel.text = [dic objectForKey:@"name"];
float distance = [[dic objectForKey:@"distance"] floatValue];
NSString *distanceWithUnity;
distance = distance*1000;
if (distance > 1000) 
    distanceWithUnity = [NSString stringWithFormat:@"%.2f km", distance/1000];
 else 
    distanceWithUnity = [NSString stringWithFormat:@"%.0f mt", distance];

cell.poiDistanceLabel.text = distanceWithUnity;
[dic release];
return cell;

一切正常,但是当 UITableCell 被释放时,我得到 BAD_ACCESS 释放 poiDistanceLabel。 我发现我的代码没有问题,也没有保留错误,所以我无法理解发生了什么。 我唯一的疑问是我如何设置标签文本:这可能是问题吗?为什么会这样?

【问题讨论】:

当您从列表中滚动出其中一个单元格时,它是否会执行相同的操作? 【参考方案1】:

问题似乎出在您的 dealloc 方法中:

[super dealloc]

应该是您的 dealloc 方法中的最后一次调用,以在释放对象时保持对象“活动”。

【讨论】:

以上是关于UILabel 错误释放到 UITableViewCell的主要内容,如果未能解决你的问题,请参考以下文章

如何使自定义单元格中的 UILabel 显示保存在 UITableView 中的更改

UITableView中的UIlabel多行

如何在 UITableView 中设置 UILabel 的动作

在 UISearchBar 和 UITableView 上方添加 UILabel,如 WhatsApp 联系人

UITableview 单元格内的 UILabel,自动布局填充问题

UITableView,UILabel 文本颜色在选择行时没有改变? [关闭]