我仍然沒有通過閱讀上面的所有答案得到完整的圖片。我在下面做的普通人練習,終於幫助我理解發生了什麼。只是把它放在那裏,以防止其他初學者。
假設你有以下
@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