【问题标题】:What happens when you add a Class into NSMutableArray and you change both that object and the array?当你将一个类添加到 NSMutableArray 中并同时更改该对象和数组时会发生什么?
【发布时间】:2010-12-06 22:31:32
【问题描述】:

假设您有多个 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];
}

【问题讨论】:

    标签: iphone objective-c class nsmutablearray


    【解决方案1】:

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

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

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

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

    但同样,如果不查看具体示例,很难一概而论。

    【讨论】:

      【解决方案2】:

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

      如果您释放数组中包含的对象,然后再释放 item1 或 item2,您将从两个不同的引用中释放同一个对象两次

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

      【讨论】:

        猜你喜欢
        • 2013-10-13
        • 1970-01-01
        • 1970-01-01
        • 2018-08-03
        • 1970-01-01
        • 2011-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多