【问题标题】:How to solve this memory leak?如何解决这个内存泄漏?
【发布时间】:2011-05-05 05:17:09
【问题描述】:
+ (UITableViewCell *)inputCell {
    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"id"];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;  
    cell.textLabel.font = [UIFont boldSystemFontOfSize:14];
    return cell;
}

Xcode 显示内存泄漏。我尝试在单元初始化期间和返回期间自动释放,但应用程序在这两种情况下都崩溃了。

【问题讨论】:

  • 你必须在那里使用自动释放。您可以在使用“inputCell”方法的地方发布代码吗?我猜崩溃是在你的代码的另一部分。

标签: iphone objective-c memory-leaks


【解决方案1】:

您发布的代码会泄漏内存,因为您的 alloc init 将返回一个保留计数为 1 的单元格。大概调用代码随后将此对象返回给cellForRowAtIndexPath,它将把它附加到UITableView 并再次增加保留计数(到两个)。因此,当 UITableView 释放它的内存时,该对象的保留计数仍然为 1。

如果您尝试在此代码中自动释放对象并且它崩溃了,那么您有一个单独的错误。

【讨论】:

  • 我在一个名为 Utility 的类中编写了 inputCell 方法。我将另一个类中的 inputCell 称为 fNameCell = [Utility inputCell];
  • @Kiran 以这种方式分配单元格没有错(您确实需要自动释放)。因此,在 inputCell 调用之后检查您对该对象的操作。你会在其他地方发布它吗?
  • 不,我不会在任何地方发布它
  • @Kiran 在这种情况下,您的崩溃是在其他一些不相关的代码中。你能给我们提供一些关于这次事故的更多信息吗?
  • @Kiran 所以你没有有用的调用堆栈?听起来内存在早些时候被破坏了。也许在未初始化的指针上调用释放,类似的东西。不看所有代码就很难判断。
【解决方案2】:
UITableViewCell *cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"id"] autorelease];

应该没问题,除非你调用-inputCell的代码有问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-01
    相关资源
    最近更新 更多