UITableViewController 中的 iPhone 奇怪行为

Posted

技术标签:

【中文标题】UITableViewController 中的 iPhone 奇怪行为【英文标题】:iPhone strange behaviour in UITableViewController 【发布时间】:2011-05-14 13:17:59 【问题描述】:

我有一个带有 UIView(称为:消息)的单元格,带有 2 个 UILabel(标签、dataLabel)和 1 个 UIButton(图标按钮)。

如果我释放 dataLabel 和 iconButton,我会在运行时收到错误消息。如果我释放其他人没有问题发生。

你能帮帮我吗?

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

static NSString *CellIdentifier = @"Cell";

UIImageView *balloonView;
UILabel *label;
UIButton *iconButton;
UILabel *dataLabel;


UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cellID"] autorelease];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

    UIView *message = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, cell.frame.size.width, cell.frame.size.height)];
    message.tag = 1;

    dataLabel = [[UILabel alloc] initWithFrame:CGRectZero];
    dataLabel.backgroundColor = [UIColor clearColor];
    dataLabel.textColor = [UIColor darkGrayColor];
    dataLabel.tag = 2;
    dataLabel.numberOfLines = 0;
    dataLabel.lineBreakMode = UILineBreakModeWordWrap;
    dataLabel.font = [UIFont systemFontOfSize:11.0];
    dataLabel.textAlignment = UITextAlignmentCenter;
    dataLabel.opaque = YES;

    balloonView = [[UIImageView alloc] initWithFrame:CGRectZero];
    balloonView.tag = 3;
    balloonView.image = nil;

    label = [[UILabel alloc] initWithFrame:CGRectZero];
    label.backgroundColor = [UIColor clearColor];
    label.tag = 4;
    label.numberOfLines = 0;
    label.lineBreakMode = UILineBreakModeWordWrap;
    label.font = [UIFont systemFontOfSize:14.0];
    label.opaque = YES;

    iconButton = [UIButton buttonWithType:UIButtonTypeCustom];
    iconButton.tag = 5;

    [message addSubview:dataLabel];
    [message addSubview:balloonView];
    [message addSubview:label];
    [message addSubview:iconButton];

    [cell.contentView addSubview:message];

    [balloonView release];
    [label release];
    [message release];

else 
    dataLabel = (UILabel *)[[cell.contentView viewWithTag:0] viewWithTag:2];
    balloonView = (UIImageView *)[[cell.contentView viewWithTag:0] viewWithTag:3];
    label = (UILabel *)[[cell.contentView viewWithTag:0] viewWithTag:4];
    iconButton = (UIButton *)[[cell.contentView viewWithTag:0] viewWithTag:5];


dataLabel.frame = CGRectMake(0,0,cell.frame.size.width,20);
dataLabel.text = [NSString stringWithFormat:[[messages objectAtIndex:indexPath.row] valueForKey:DATE_TAG_NAME]];

UIImage *balloon;

[...]

balloonView.image = balloon;    

return cell;

谢谢!

【问题讨论】:

【参考方案1】:

你不需要释放 iconButton 作为它的自动释放对象。

只有在分配或保留对象时才应释放对象。

我在发布 dataLabel 时没有发现任何问题。尝试释放 dataLabel 并跳过释放 iconButton 看看会发生什么。

很可能只是因为释放了你不应该这样做的 iconButton,因为它是一个自动释放对象。

【讨论】:

以上是关于UITableViewController 中的 iPhone 奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewController 中的 iAd

UITableViewController 中的 iOS tableHeaderView 从不显示

UITableViewController 中的顶栏背景

框架中的 UITableViewController 未调用 didSelectRowAtIndexPath

从 UITableViewController 中的按钮创建操作

在 UITableViewController 中的 UITableViewCells 之间进行通信