iphone - Autorelease 上的自定义 UITableViewCell 导致应用程序崩溃

标签 iphone ios uitableview autorelease

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

最佳答案

你的初始化方法看起来很不对。

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

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

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

关于iphone - Autorelease 上的自定义 UITableViewCell 导致应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12726359/

相关文章:

ios - Xcode 6 Swift - 显示本地 PDF

javascript - 使用 HTML 和 JS 的 iPhone 游戏中的性能问题,带有 appMobi

ios - 如何修复 'UITextFieldDidEndEditingReason' 仅适用于 iOS 10.0 或更高版本

ios - 如何在快速自定义单元格中单击按钮时传递插件项目?

ios - 表格 View 单元格仅在滚动关闭然后重新打开后才能正确屏蔽

iphone - 向按钮添加 "rate my app"操作

iphone - 支付宝ios6问题

ios - 如何关闭文本字段中的键盘

ios - 使用 Swift 在子类中更改方向更改时更改自定义 View 的框架

ios - UITableView 在单元格选择上更改图像并重置其他图像