0

我有一个使用界面生成器设计的表格视图的自定义单元格。在它的 .m 文件中,我有一些类似这样的代码来从包中获取自定义单元格的 xib。

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        NSArray *nibArray = [[NSBundle mainBundle] loadNibNamed:@"SubItemsCustomCell" owner:self options:nil];
        self = [nibArray objectAtIndex:0];    }
    return self;
}

然后当我在我的 cellForRowAtIndexPath 方法中使用这个单元格并传递一个自动释放消息时

if (!cellForSubItems) {
    cellForSubItems = [[[SubItemsCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"SubItemCell"] autorelease];
}

当我滚动 tableView 时它崩溃了,

-[SubItemsCustomCell release]: message sent to deallocated instance 0xed198b0

当我使用代码制作自定义单元格时,它从未崩溃过,但在这里却发生了,为什么会这样?此外,当我不自动释放它时,它运行得非常好,但显然它会有内存泄漏。请帮我解决这个问题。提前致谢。

编辑:我没有使用 ARC。

4

2 回答 2

2

您的 init 方法看起来非常错误。

在调用它时,已经分配了一个对象。然后,你用你从笔尖加载的东西替换那个对象。在这里,您已经泄漏了应该首先释放的旧实例。来自 nib 的新对象是自动释放的(请参阅命名约定),因此您应该在此处保留它。

我强烈建议完全删除该虚假代码。您不想手动调用 alloc/init,只是用那里的 nib 替换它。直接从笔尖加载。

所以是的,您的代码可能会泄漏,但可能不是您想的那样。

于 2012-10-04T11:59:07.907 回答
1

尝试我的以下代码以添加单元格UITableView

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        SubItemsCustomCell *cell = (SubItemsCustomCell *) [tableView      dequeueReusableCellWithIdentifier:nil];

        if (cell == nil) 
        {

            NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"SubItemsCustomCell" owner:self options:nil];

            for (id currentObject in topLevelObjects){
                if ([currentObject isKindOfClass:[UITableViewCell class]]){
                    cell =  (SubItemsCustomCell *) currentObject;
                    break;
                }
            }
             ///do something here
        }

        return cell;
    }

我希望这可以帮助你...

:)

于 2012-10-04T11:51:29.400 回答