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

Objective c 如果将刚创建的对象添加到可变数组中并释放对象,会发生什么情况?,objective-c,Objective C,如果将刚创建的对象添加到可变数组并释放对象,会发生什么情况?没关系: NSMutableArray *array = [[NSMutableArray array] retain]; Object *obj = [[Object alloc] init]; [array addObject:obj]; [obj release]; 我使用alloc,init创建了这个对象,所以我是这个对象的所有者。我已将对象添加到数组中,数组成为所有者。然后我释放了这个物体。但它仍然有一个所有

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

没关系:

  NSMutableArray *array = [[NSMutableArray array] retain];
  Object *obj = [[Object alloc] init];
  [array addObject:obj];
  [obj release];
我使用
alloc,init
创建了这个对象,所以我是这个对象的所有者。我已将对象添加到数组中,数组成为所有者。然后我释放了这个物体。但它仍然有一个所有者——数组

顺便说一下:如果您要释放数组,对象将自动释放。

可以:

  NSMutableArray *array = [[NSMutableArray array] retain];
  Object *obj = [[Object alloc] init];
  [array addObject:obj];
  [obj release];
我使用
alloc,init
创建了这个对象,所以我是这个对象的所有者。我已将对象添加到数组中,数组成为所有者。然后我释放了这个物体。但它仍然有一个所有者——数组


顺便说一下:如果您要释放数组,对象将自动释放。

这取决于。如果在将对象添加到阵列之前拥有该对象,您仍然必须释放自己的所有权声明以避免泄漏-阵列对该对象的所有权声明是独立的,并且不会免除您对内存管理规则的责任

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.:-)

视情况而定。如果在将对象添加到阵列之前拥有该对象,您仍然必须释放自己的所有权声明以避免泄漏-阵列对该对象的所有权声明是独立的,并且不会免除您对内存管理规则的责任

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.:-)

我会这样分配数组:

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。

我会这样分配数组:

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。

注意,由于数组拥有对象的所有权,创建不属于调用方的对象的类似代码也可以使用。还要注意,在这个特定的代码段中,没有必要将
-retain
发送到可变数组。@bavariable:如果对象不属于调用方,则在调用[obj release]时会将其删除因为它只有一个保留计数器。在这种情况下,我认为在释放数组时也会出现错误的访问异常。没错,我错过了“释放对象”部分。你是对的:虽然对象仍然是活动的,因为它属于数组,但当数组本身被释放时,会出现异常。尽管如此。如果有一个方便的方法返回一个无主对象,那么可以通过使用它来简化,只需
[array addObject:[object object]]
。是的,对以这种方式创建的对象调用
-release
会崩溃-所以不要这样做。:-)注意,由于数组拥有对象的所有权,创建不属于调用方的对象的类似代码也可以使用。还要注意,在这个特定的代码段中,没有必要将
-retain
发送到可变数组。@bavariable:如果对象不属于调用方,则在调用[obj release]时会将其删除因为它只有一个保留计数器。在这种情况下,我认为在释放数组时也会出现错误的访问异常。没错,我错过了“释放对象”部分。你是对的:虽然对象仍然是活动的,因为它属于数组,但当数组本身被释放时,会出现异常。尽管如此。如果有一个方便的方法返回一个无主对象,那么可以通过使用它来简化,只需
[array addObject:[object object]]
。是的,对以这种方式创建的对象调用
-release
会崩溃-所以不要这样做。:-)