2011-10-06 126 views
2

仍然不熟悉Objective-C和我感到困惑枚舉...混淆枚舉...如何更改枚舉過程中的對象?

比方說,我有8個「車」對象和所有的人的一個NSArray有自己的「paintColor」屬性設置爲「紅色。我想通過數組枚舉並設置每個Car.paintColor屬性設置爲「藍色」,我該怎麼辦呢?

for (Car *car in myArray){ 
    car.paintColor = @"blue"; 
} 

不過,如果我做

Car *testCar = [myArray objectAtIndex:2]; 

NSLog(@"The car color for 3rd object in myArray is %@", testCar.color); 

我仍然獲得「紅」。所以看來枚舉只是創建一個臨時對象,但不是mod ify數組中包含的實際對象。

什麼是正在做我想做的事情?我有很多的情況下我想通過一個數組枚舉,但實際上改變在陣列內

感謝

--edit

好的項目,感謝信息..你能解釋一下爲什麼這不起作用?

我有一個名爲「carsArray」的NSArray設置爲包含三個NSMutable字符串對象(「Buick」,「Bronco」,「Cadillac」)的屬性。

我再做

for (NSMutableString *car in myArray) { 
    car = [NSMutableString stringWithFormat:@"test"]; 
} 

NSMutableString *temp = [myArray objectAtIndex:2]; 
NSLog(@"third car is %@", temp); 

的NSLog是說 「凱迪拉克」。它不應該是「測試」嗎?

+7

枚舉不應該產生臨時值。有一件事我注意到,在你調用NSLog的時候你正在讀取顏色屬性,但在枚舉器中你正在設置paintColor屬性。它可能是一個簡單的類型是搞砸了嗎? – Mattia

+0

感謝您的信息。我已經添加了第二個示例,我想知道爲什麼那個不起作用 – sayguh

回答

2

做你想做什麼:

for (NSMutableString *car in myArray) { 
    [car setString:[NSMutableString stringWithFormat:@"test"]]; 
} 

指針的基本認識。這不是特別枚舉,使得它以這種方式工作。

NSMutableString *car1 = [NSMutableString stringWithFormat:@"Cadillac"]; 
NSMutableString *car = car1; 
[car setString:[NSMutableString stringWithFormat:@"Ford"]]; 
NSLog(@"car1 = %@", car1); 

// Ford 

car = [NSMutableString stringWithFormat:@"Buick"]; 
NSLog(@"car1 = %@", car1); 

// Ford 

當您訂車= CAR 1,汽車是一個 「別名」 爲CAR 1。您可以在汽車上設置屬性,並將屬性設置在car1上。您可以在汽車上調用像setString這樣的方法,該方法將在car1上調用。 car和car1是指針,它們指向相同的對象。

當您將賦值給一個新值給汽車時,它只是使其成爲另一個對象的別名,不再是與car1相同的對象。此作業不會影響car1,也不會影響您之後在汽車上使用的任何財產訪問者或方法。

該枚舉有效地依次執行car = myArray[0],car = myArray[1],car = myArray[2]。 (速記:myArray[0]是不正確的Objective-C語法。)

2

快速枚舉不會複製對象也不會創建臨時副本。 NSArray是指向對象的指針的數組。快速枚舉只是通過指針列表循環,每次循環都會得到下一個指針。指針指向數組指向的同一個對象。

您在快速枚舉循環中更改對象內容的方式沒問題。

您的問題在別處(請參閱Mattia的評論)。

+0

我已經添加了一個編輯..你知道那是行不通的嗎? – sayguh