Obj-C将对象添加到数组中

时间:2014-01-24 09:00:03

标签: objective-c arrays nsmutablearray

你能否澄清一下以下内容: 我有

NSMutableArray *_array;

...

_array = [[NSMutableArray alloc] initWithCapacity:20];

MyClassItem *item;
item = [[MyClassItem alloc] init];

item.a = @"a";
item.b = @"b";
[_array addObject:item];

item.a = @"a1";
item.b = @"b1";
[_array addObject:item];

_array = [[NSMutableArray alloc] initWithCapacity:20]; MyClassItem *item; item = [[MyClassItem alloc] init]; item.a = @"a"; item.b = @"b"; [_array addObject:item]; item.a = @"a1"; item.b = @"b1"; [_array addObject:item];

在这种情况下,我在_array中收到两个类似的对象, item [0] .a == item [1] .a == @“a1” 但我认为项目[0] .a应该是@“a”......

我知道如果我在每次将它添加到数组之前初始化项目,一切都会好的,

MyClassItem *item;
item = [[MyClassItem alloc] init];

item.a = @"a";
item.b = @"b";
[_array addObject:item];

item = [[MyClassItem alloc] init];//If I add this line, everything is OK

item.a = @"a1";
item.b = @"b1";
[_array addObject:item];

我想这样 - 我有一个对象,我修改它的属性并添加到数组中,之后我再次修改它属性并将其添加到数组中,但如果它只将指针指向它对象,为什么我使用相同对象的init修复它?

在第一次初始化期间分配的内存会发生什么?

希望你了解我的挫折感)

4 个答案:

答案 0 :(得分:1)

在第一种情况下,您正在更改同一个对象。该数组包含两个指向内存中相同位置的指针。知道指针如何工作可以回答你的问题。在第二个示例中,您将创建一个新对象(第一个对象由数组保留并且不会丢失),然后您将获得正确的不同属性。

答案 1 :(得分:0)

您有一个对象,由指针item引用。首先,您将item.a指定为@"a",然后将其a属性更改为@"a1"。但是,这两次都是同一个对象。要创建另一个MyClassItem,您必须再次编写item = [[MyClassItem alloc] init]。它是创建对象的alloc。

答案 2 :(得分:0)

这是因为您的item指向内存位置,每当您更新item时,该内存位置上的数据都会更新,_array会存储item的内存位置而不是他们的价值。

但如果你分配了新内存,那么在两个不同的内存位置上有两个item副本,这就是为什么当你更新第二个内存位置时第一个内存位置没有改变。

答案 3 :(得分:0)

要理解这一点,你需要知道对象和指向对象的指针之间的区别。

对象是实际对象及其所有数据。指针是一种信息,在内存中您存​​在对象,并允许您访问该对象。有关更多信息,请参阅C中变量名称之前的含义*。

在objc中,您只能拥有指向对象的指针。所以在这种情况下,这就是发生的事情。

_array = [[NSMutableArray alloc] initWithCapacity:20];

MyClassItem *item;
item = [[MyClassItem alloc] init]; //here object is created, pointer to it is stored in 'item'

item.a = @"a"; //you manipulate that object
item.b = @"b";
[_array addObject:item]; //here pointer to it is added to array. Object is not copied, array will contain a pointer pointing at initial item. So item and _array[0] is not two different objects - it's one object.

item.a = @"a1"; //and you are modifying this object
item.b = @"b1";
[_array addObject:item];
相关问题