如果将刚刚创建的对象添加到可变数组并释放对象,会发生什么?
答案 0 :(得分:3)
这取决于。如果您在将对象添加到阵列之前拥有该对象,您仍然必须释放自己的所有权声明以避免泄漏 - 阵列对该对象的所有权声明是独立的,并且没有做任何事情来免除您对内存的责任管理规则。
Object *obj = [[Object alloc] init];
[anArray addObject:obj];
[obj release];
另一方面,如果你不拥有该对象,那么仍然在将其添加到数组后仍然不拥有它,但仍然不能释放它。该阵列确实建立了自己的所有权声明,但就像您自己的代码一样,它负责平衡自己的声明。
Object *obj = [Object object];
[anArray addObject:obj];
// or, avoiding a temp variable
[anArray addObject:[Object object]];
当您释放数组或从数组中删除对象时(假设它是一个可变数组),该数组将释放自己的所有权声明。调用代码对此没有任何附加责任 - 数组提出了所有权声明,因此它负责在完成对象时释放它。
换句话说,您是否有责任释放某个对象 与您是否已将其添加到集合中有关。阵列的责任也没有任何与阵列外发生的事情有关。这是封装的核心;每个类与其他类内部的内容尽可能隔离。 NSVegas会发生什么,留在NSVegas。 : - )
答案 1 :(得分:1)
没关系:
NSMutableArray *array = [[NSMutableArray array] retain];
Object *obj = [[Object alloc] init];
[array addObject:obj];
[obj release];
我使用alloc, init
创建了对象 - 所以我是对象的所有者。我已将对象添加到数组中,数组成为所有者。然后我发布了这个对象。但它仍然拥有一个所有者 - 阵列。
顺便说一句:如果您要释放数组,对象将自动释放。
答案 2 :(得分:0)
我会这样分配数组:
NSMutableArray *array = [[NSMutableArray alloc] init];
[array retain]
Object *obj = [[Object alloc] init]; //retain count = 1
添加对象时,保留计数将变为+2
[array addObject:obj];
//When you release the retain count goes to 1 (object still exists)
[obj release];
如果你发布了数组
[array release];
然后对象计数变为0。