还是Objective-C的新手,我对枚举感到困惑......
假设我有一个包含8个“Car”对象的NSArray,并且所有这些对象都将其“paintColor”属性设置为“red”。我想枚举数组并将每个Car.paintColor属性设置为“blue”。我这样做了吗?
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);
我仍然得到“红色”。因此,枚举似乎只是创建一个临时对象,但不会修改数组中包含的实际对象。
做我正在尝试做的事情的正确方法是什么?我有很多情况需要通过数组进行枚举,但实际上会更改数组中的项目
由于
- 编辑
好的,谢谢你的信息..你能解释为什么这不起作用吗?
我有一个名为“carsArray”的NSArray设置为包含三个NSMutable字符串对象(“别克”,“野马”,“凯迪拉克”)的属性。
然后我做
for (NSMutableString *car in myArray) {
car = [NSMutableString stringWithFormat:@"test"];
}
NSMutableString *temp = [myArray objectAtIndex:2];
NSLog(@"third car is %@", temp);
NSLog说的是“凯迪拉克”。不应该是“测试”吗?
答案 0 :(得分:2)
快速枚举不会复制对象,也不会制作临时副本。 NSArray是对象的指针数组。快速枚举只是循环遍历指针列表,每次循环都会得到下一个指针。指针指向数组指向的同一对象。
您在快速枚举循环中更改对象内容的方式很好。
你的问题出在其他地方(见Mattia的评论)。
答案 1 :(得分: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 = car1时,car是car1的“别名”。您可以在汽车上设置属性,并在car1上设置属性。你可以在car上调用类似setString的方法,该方法将在car1上调用。 car和car1是指针,它们指向同一个对象。
当你为汽车分配一个新值时,它只是使它成为另一个对象的别名,而不再是与car1相同的对象。该任务不会影响car1,也不会影响你在赛车上使用的任何属性访问者或方法。
枚举有效地依次执行car = myArray[0]
,car = myArray[1]
,car = myArray[2]
。 (简写:myArray[0]
不正确的Objective-C语法。)