我对为多个数组共享的数组元素释放内存感到困惑。这是场景:
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:谁应该释放食物的记忆以及如何?
答案 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)
添加到数组时将保留一个对象,并在从数组中删除时释放该对象。
如果您使用的是自动释放的对象,则无需执行任何操作。
如果您使用常规对象,则可以在将其添加到第一个数组后将其释放。