共享数组元素的内存管理

时间:2010-02-09 18:02:14

标签: objective-c memory-management

我对为多个数组共享的数组元素释放内存感到困惑。这是场景:

Manager类有一个实例变量NSMutableArray * mgrArray

Helper类有一个实例变量NSMutableArray * helperArray。

Manager的init方法:

NSMutableArray* mgrArray = [[[NSMutableArray alloc] init] autorelease];
    for (int i=0; i<10; i++) {
        Food *f = [[[Food alloc] initWithType:@"Fruit"] autorelease];
        [mgrArray addObject:f];
    }

Helper的init方法:

NSMutableArray* helperArray = [[[NSMutableArray alloc] init] autorelease];

manager对象将一些mgrArray元素传递给Helper类,以存储Helper自己的访问目的(比如效率)。执行此操作的一些Manager方法:

Food *e1 = [mgrArray objectAtIndex:3];
Food *e2 = [mgrArray objectAtIndex:5];
Food *e3 = [mgrArray objectAtIndex:7];

[helper. helperArray addObject:e1];
[helper. helperArray addObject:e2];
[helper. helperArray addObject:e3];

问题1:将e1添加到helperArray时,是否应该复制或保留,或者如上所述是否正常?
问题2:谁应该释放食物的记忆以及如何?

2 个答案:

答案 0 :(得分:1)

如果将对象放入数组中,它会保留它。如果从数组中删除对象,则阵列会将其释放。

就这么简单;所有权 - 保留 - 应始终受封装线的约束。

如果您在使用对象时需要确保对象保持活动状态,请保留它。一个边缘的情况是你做了类似的事情:

foo = [someArray objectAtIndex: 0];
[someArray removeObjectAtIndex: 0];

此时,foo可能已被释放。修复:

foo = [someArray objectAtIndex: 0];
[foo retain];
[someArray removeObjectAtIndex: 0];
.. do stuff ..
[foo release];
  

问题1:将e1添加到   helperArray,应该复制还是   保留或者写得不错   以上?

只需将e1添加到helperArray即可。完成。

  

问题2:谁应该释放   食物和食物的记忆   如何?

当数组被释放到dealloc'd时,数组中包含的所有对象都将被释放(但不一定要解除分配,除非其他任何东西都没有保留)。

答案 1 :(得分:1)

添加到数组时将保留一个对象,并在从数组中删除时释放该对象。

如果您使用的是自动释放的对象,则无需执行任何操作。

如果您使用常规对象,则可以在将其添加到第一个数组后将其释放。