【问题标题】:Releasing objects created by functions释放由函数创建的对象
【发布时间】:2011-08-10 15:23:32
【问题描述】:

我正在学习obj-c,有一个关于内存管理的问题:

假设我有一个返回 NSDictionary 的函数,“fDictionary”,

NSDictionary *fDictionary {
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
                              [NSNumber numberWithInt:1], @"blah",nil];
return dict
} 

由特定方法调用的:

-(int)fNumber {
  NSDictionary *f = fDictionary();
  return [[f objectForKey:@"blah"] intValue];
}

我不清楚的是我应该如何/在哪里释放 NSDictionary 对象。

我应该在方法中释放它,还是在函数中自动释放它?

【问题讨论】:

  • 这取决于fDictionary函数的代码。请同时发布。
  • 我已编辑帖子以包含该功能

标签: objective-c memory-management


【解决方案1】:

如果函数编写正确,字典会自动释放,因此您根本不必释放它。它很快就会被自动释放池释放。

您只发布您自己保留或复制的内容。这些是你“拥有”的东西。确保不要过早释放它们。如果它们是本地的,通常的点是在分配或保留它们的函数结束之前。如果它们是 ivar,最好的点通常是 ivar 所属类的 dealloc。

【讨论】:

  • 所以如果我需要返回字典以在代码的其他地方使用,那么我需要保留它,但在上面的示例中我不会?
【解决方案2】:

在不了解fDictionary 的情况下很难确定,但大多数Object C 代码遵循的约定如下:

  • 如果实例是使用alloccopy 创建的,则您拥有它
  • 如果你retain它,你就拥有它
  • 否则你不拥有它

如果你不拥有它,你不应该release它。

所以按照惯例,该函数将返回一个 autoreleased 对象,您的方法中不需要任何额外的管理。

【讨论】:

    【解决方案3】:

    一般规则是,如果你的代码分配了一些东西,你需要释放或自动释放它。

    如果这是其他人的函数,你会认为返回的字典是自动释放的——这是这里的约定。我会确保 fDictionary 返回一个自动发布的 NSDictionary。

    【讨论】:

      【解决方案4】:

      如果您从名称以“alloc”、“new”、“copy”或“mutableCopy”开头的方法接收到对象,则必须释放或自动释放它。否则它已经被自动释放了。

      如果你保留了一些东西,你必须释放它,没有其他东西可以为你做这件事。

      每个 Obj-C 程序员都必须阅读Memory Management Guide

      【讨论】:

        【解决方案5】:

        没有。

        NSDictionary dictionaryWithObjectsAndKeys:(实际上只是[[[NSDictonary alloc]initWithObjectsAndKeys:, nil]autorelease])返回一个自动释放的NSDictionary。这意味着当计算机确定不再需要该词典时,该词典将自动释放。

        如果在fDictionary() 中的字典是alloced,则需要手动释放它。根据经验,总是从函数/方法返回自动释放的对象,因此函数/方法的用户不必担心内存管理。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-05-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-08
          • 1970-01-01
          • 1970-01-01
          • 2013-02-19
          相关资源
          最近更新 更多