如果将刚刚创建的对象添加到可变数组并释放对象,会发生什么?

时间:2011-04-15 02:28:36

标签: objective-c

如果将刚刚创建的对象添加到可变数组并释放对象,会发生什么?

3 个答案:

答案 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。