【问题标题】:Custom UITableViewCell On Autorelease causes a crash in application自定义 UITableViewCell On Autorelease 导致应用程序崩溃
【发布时间】:2012-10-04 11:33:47
【问题描述】:

我有一个使用界面生成器设计的表格视图的自定义单元格。在它的 .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。

【问题讨论】:

  • 好的,看看我在 cellForRawAtIndexPath: Method.. 中使用 customcell 的另一种方法..]

标签: iphone ios uitableview autorelease


【解决方案1】:

你的 init 方法看起来很不对。

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

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

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

【讨论】:

  • 感谢您的解释,您的回答说明了很多。现在我确切地知道我在哪里以及如何错了。你是对的,如果它是直接从 nib 文件中获取的,我们不需要分配和初始化。
【解决方案2】:

试试我下面的代码在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;
    }

希望对你有帮助……

:)

【讨论】:

  • 好的,让我试试。这也告诉我应该在自定义单元格的 .m 文件中注释用于获取 xib 文件的代码。
  • 好的,伙计,我也使用带有NIB的自定义单元格,它的工作正常......试试吧:)
  • 你工作得很好......谢谢你的回答..我在这里看到了,因为我们只使用带有 nib 的数组的引用,我们不需要释放它的内存,因为我们从来没有分配给它.. 再次感谢您点亮我的灯泡。我很久以前就看到过这样的代码,但是我没有在需要的时候使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 2012-09-22
  • 1970-01-01
  • 2023-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多