【问题标题】:NSMutableArray memory managementNSMutableArray 内存管理
【发布时间】:2010-10-02 03:46:36
【问题描述】:
NSMutableArray *a1 = [[NSMutableArray alloc] init];
NSMutableArray *a2 = [NSMutableArray array];

TempObj *obj = [[TempObj alloc] init]; //assume this line is repeated for each obj
[a1 addObject:obj];
[a1 addObject:obj2];
[a1 addObject:obj3];
[a1 addObject:obj4];

[obj release];
[obj2 release];
[obj3 release];
[obj4 release];

[a1 release];

好的,所以 a2 是一个自动释放 obj,所以我不必调用 release 吗?另外你怎么知道你什么时候得到一个自动释放对象?

对于a1,我不必循环遍历数组并首先释放每个对象吗?如果我调用 [a1 removeAllObjects]; 怎么办?是否调用 [[a1 objectAtIndex:#] release];

我应该在将这些对象添加到数组后释放它们吗?

【问题讨论】:

    标签: iphone cocoa macos


    【解决方案1】:

    当您将对象添加到数组时,它会在该对象上调用retain。如果您不释放指向该对象的指针,那将是泄漏。当你释放数组时,它会在它持有的所有对象上调用release,因为它之前调用了retain

    至于 autorelease 与 release,唯一确定的方法(除了可能阅读文档)是通过方法的名称。我相信一般的规则是,如果你没有分配对象,那么你不负责释放它。

    关于对象创建方法,所有便捷方法(array:arrayWithObjects:arrayWithArray: 等)都返回自动释放的对象。但是,它们对应的 init 方法(init:initWithObjects:initWithArray: 等)不会 - 如果您调用它们,则您有责任在返回的对象上调用 release

    我似乎在这里想起了有关此主题的其他一些问题 - 您可以尝试四处搜索以获得更全面的解释。

    【讨论】:

    • 因此循环遍历所有对象并逐个释放,而不是在数组本身上调用 release 是错误的。
    【解决方案2】:

    将Objective-C 内存管理视为所有权 比保留释放更容易。当您将对象添加到数组时,数组现在是对象的共同所有者,并负责正确管理内存。当所有者(任何包含您发布的代码的对象)在对象上调用 release 时,它就放弃了所有权,现在该数组是唯一的所有者。

    Apple 对所有权在 Cocoa 中的工作方式有很好的了解(包括您如何知道何时负责在对象上调用 release):Memory Management Programming Guide For Cocoa。如果你想使用 Cocoa,这是一本必读的书。

    【讨论】:

      【解决方案3】:

      要记住的基本事项是:您必须平衡对“init”、“retain”或“copy”的每次调用与对“release”或“autorelease”的相应调用。这就是您需要知道的全部内容。

      在您的示例中,a1 调用了“init”,因此您需要在某处有一个“release”。与“obj”同上。你没有在其他任何东西上调用“init”、“retain”或“copy”,所以你不需要在其他任何东西上调用“release”或“autorelease”。

      【讨论】:

      • 但是我什么时候释放 Obj,因为我将它添加到可变数组中,我是在添加它之后立即释放我创建的 obj,因为数组创建了一个副本,还是在我释放时释放它数组?
      • 一旦不再需要对它做任何事情,就立即释放它。将它添加到数组后,您不再需要对它执行任何其他操作,因此您可以释放它。数组(内部)需要保留它以便保留它,但这是一个内部实现细节。
      【解决方案4】:

      您在将 obj、obj2、obj3、obj4 添加到数组后就释放了它们(最好的方法)。否则你必须循环并释放每个对象(这是愚蠢的方式:我到目前为止所做的)。

      【讨论】:

        【解决方案5】:

        我不知道我是对是错

        NSMutableArray *a1 = [[NSMutableArray alloc] init]; // will be autorelease
        NSMutableArray *a1 = [NSMutableArray alloc]; // will not autorelease
        

        在你之后[a1 removeAllObjects];

        【讨论】:

          猜你喜欢
          • 2011-09-06
          • 2011-07-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-13
          • 2011-12-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多