你能否澄清一下以下内容: 我有
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修复它?
在第一次初始化期间分配的内存会发生什么?
希望你了解我的挫折感)
答案 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];