【问题标题】:Objective-C memory leak, memory management questionObjective-C内存泄漏,内存管理问题
【发布时间】:2011-06-03 18:25:01
【问题描述】:

我是 Objective C 的新手,我相信我在这个函数中存在内存泄漏情况,但我不确定何时删除/释放对象。

由于我将recipeObject 存储到我的视图中,我将它释放到视图的dealloc 中,但我不确定视图?

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    RecipeObject * recipeObject = (RecipeObject *)[maRecipes objectAtIndex:indexPath.row];
    RecipeView * recipeView = [[RecipeView alloc] initWithNibName:@"RecipeView" bundle:nil];
    [recipeView setRecipeObject:RecipeObject];  
    [self.navigationController pushViewController:recipeView animated:YES];
}

谁能给我举个例子,或者解释一下?

【问题讨论】:

  • 请提供有用的标题!

标签: objective-c ios4 xcode4


【解决方案1】:

当你在 Objective-C 中处理内存管理时要记住的第一条规则是你要对你 (1) 分配(使用 alloc)、(2) 新分配(使用 @987654322)的任何事情负责@)、(3) 复制(使用 copy)或 (4) 保留(使用 retain)。在这四种情况下,您必须明确地release(或autorelease)这些引用。

在您的示例中,由于您分配了 recipeView,因此必须在将其添加到导航控制器后将其释放。

RecipeView * recipeView = [[RecipeView alloc] initWithNibName:@"RecipeView" bundle:nil];
[self.navigationController pushViewController:recipeView animated:YES];
[recipeView release];

如果您不这样做,您将泄漏 recipeView,因为一旦方法退出,它就会超出范围,您将无法再访问堆上分配的空间。

这有意义吗?

【讨论】:

  • 所以我总是在执行 1、2 或 3 之后立即释放对象吗?或者有没有我会在以后发布的情况?我认为答案是肯定的......但无论如何,它确实有道理,我感谢你的帮助?
  • 另外,如果我在函数中执行此操作并返回内容会怎样?我是在退货前还是放出来,还是应该稍后放出来? NSMutableArray * content = [NSMutableArray new];
  • 你应该在完成后释放它。如果您不需要它,有理由保留分配的内存。在某些情况下,您将立即完成它,而在其他情况下,您需要坚持一段时间。随着您获得更多经验,这将变得更加清晰。
  • 如果你返回一个你在方法中分配的对象,那么你应该自动释放它。返回 [内容自动发布]。它将被添加到自动释放池并在适当的时间释放。
  • 别忘了,除了alloccopynew 之外,您还对retain 专门负责的任何事情负责。
【解决方案2】:

您必须在pushViewController 之后释放recipeView。 推送时完成保留,然后弹出释放时完成。

【讨论】:

    【解决方案3】:

    将此添加到代码的最后一行

    [recipeView release];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-19
      • 2011-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-07
      • 1970-01-01
      相关资源
      最近更新 更多