我仍然没有通过阅读上面的所有答案得到完整的图片。我在下面做的普通人练习,终于帮助我理解发生了什么。只是把它放在那里,以防止其他初学者。
假设你有以下
@interface Class X
-(void) methodX:(NSMutableArray *)array;
@end
在有下列顺序代码的其他部分
ClassX *objectX = [[ClassX alloc] init];
NSMutableArray *arrayXX = [@[@(1), @(2)] mutableCopy];
//What is stored in arrayXX is the address in the heap at which the NSMutableArray object starts, lets call this address ZZZ
//array starting at address ZZZ in the heap now contains NSNUmbers @1,@2
[objectX methodX:array]
当你调用[objectX methodX:array]
,什么是由该方法获得是副本的array
。由于数组包含一个地址(即一个指针),拷贝的特殊之处在于收到的是地址为ZZZ的另一个变量。所以,如果methodX确实[array removeObjectAtIndex:0]
,那么从地址ZZZ开始的对象会受到影响(现在只包含一个NSNUmber @(2))。所以,当方法返回时,原始数组也会受到影响。
假设改为methodX确实array = [@[@(2)] mutableCopy];
那么原始数组不会受到影响。这是因为你没有进入ZZZ地址并改变某些东西。相反,您将覆盖该方法收到的副本中的ZZZ重写为不同的地址YYY。 YYY地址是包含一个元素NSNUmber @(2)的NSMUtableArray对象的开始。原始的ZZZ地址仍然包含一个带有两个元素的NSMUtableArray。 @(1)和@(2)。所以,当方法返回时,原始数组不受影响。
嗨,彼得:-)我希望你在新的一年有一个好的开始。在````````````````````````````````我在这里贴了这个帖不好意思,我还是不太明白:如果我们只传递了一个`*`(一个指向对象的指针),那么就可以对对象进行更改了,对吧?为什么我们仍然需要传递一个指向对象的指针来改变对象?首先十分感谢。问候。 – Unheilig 2014-01-08 00:03:51
@Unheilig:“如果我们只传递一个`*`(指向一个对象的指针),那就足以对对象进行更改了,对吗?”对。您只需要指向该对象的指针即可将消息发送到该对象。 “为什么我们仍然需要传递一个指向对象的指针来改变对象呢?”因为你没有对对象进行更改;你正在创建一个新对象并将其返回给调用者。你可以通过在调用者给你的地址分配它 - 指向变量的指针,在那里你将把指针指向对象。 – 2014-01-08 03:41:15