将类添加到NSMutableArray并更改该对象和数组时会发生什么?

时间:2010-12-06 22:31:32

标签: iphone objective-c class nsmutablearray

假设您有几个Class对象声明并将其添加到NSMutableArray中,那么您可以修改Class对象和NSMutableArray对象。怎么了?

代码示例:

MyClass *item1;
MyClass *item2;
NSMutableArray *itemHolder;

item1 = [[MyClass alloc] init];
item2 = [[MyClass alloc] init];
itemHolder = [[NSMutableArray alloc] initWithObjects:item1,item2,nil];

-(void)someFunction{
  [item1 setVarName:@"item1"];
  [item2 setVarName:@"item2"];
  for(MyClass *items in itemHolder) [items setVarName:@"item"];
}

我想我通常会在将item1和item2添加到itemHolder后释放它,但它不会破坏内存管理规则吗?因为在dealloc的最后,你仍然可以发布所有内容

-(void)dealloc{
  [item1 release];
  [item2 release];
  [itemHolder release];
}

2 个答案:

答案 0 :(得分:1)

将对象(item1和item2)添加到数组时,数组只是存储指针。对象本身不会被复制。

因此,当您在NSArray中的第一个项目上对item1或setVarName设置VLAN名称时,这两个操作都会影响完全相同的对象(同一个实例)

对于内存管理,当您将项目添加到NSArray时,NSArray(可变或不可变)将保留每个项目。当数组被释放时,它将释放它们中的每一个。

如果您还有其他需要单独保留每个项目,那么您应该这样做(就像在您的示例中一样)。但请记住,在正常的程序中,您经常只是将新对象添加到数组中并立即释放它们,因为数组已保留它们。

但同样,如果不看一个具体的例子,很难概括。

答案 1 :(得分:0)

如果您尝试发布已发布的内容,则可能会出现EXC_BAD_ACCESS或分段错误。尽量确保不要两次释放同一个对象。

如果释放数组中包含的对象并稍后释放item1或item2,则将从两个不同的引用中释放相同的对象

如果更改了类对象,那么数组中的版本也会受到影响,反之亦然。