我想让数组中的所有对象执行选择器.我已经发现了适当命名的makeObjectsPerformSelector:
方法,但我有一个问题.如果我在数组上使用它,它会更改现有数组还是返回一个新数组?如果它修改了现有对象,那么在应用选择器的情况下返回新数组的最简单方法是什么?
makeObjectsPerformSelector:将针对数组中的每个对象运行该选择器.如果选择器修改了这些对象,则会修改它们.它没有返回任何东西.现在,有一个catch,默认情况下,Cocoa中的大多数副本都是浅拷贝,这意味着你得到一个新的数组,但它指向的底层对象是相同的对象.您将需要使用initWithArray:copyItems来复制根级项目.如果你想要一个包含已更改对象的新数组以及旧数组,请执行以下操作:
NSArray *newArray = [[NSArray alloc] initWithArray:oldArray copyItems:YES]; [newArray makeObjectsPerformSelector:@selector(doSomethingToObject)];
如果我在数组上使用它,它会更改现有数组还是返回一个新数组?
没有.
首先,阅读签名:
- (void)makeObjectsPerformSelector:(SEL)aSelector
void
在它之后没有星星,意味着"不会返回任何东西".
其次,请注意,这是NSArray的一种方法,它是一个不可变类.因此,makeObjectsPerformSelector:
不会改变接收阵列,因为这是不可能的.
有NSMutableArray,因为它是NSArray的子类,所以它继承makeObjectsPerformSelector:
.但是,如果NSMutableArray更改了该方法的行为,则其文档将具有自己的方法列表(请参阅init
各种类文档中的许多定义).没有这样的列表,因此您可以安全地(并且正确地)推断其-[NSMutableArray makeObjectsPerformSelector:]
工作原理与完全相同-[NSArray makeObjectsPerformSelector:]
.
对象可以自己修改以响应您的消息,但是数组本身将包含与makeObjectsPerformSelector:
之前相同的对象.
除了其他答案之外,如果您确实需要创建一个具有调用方法结果的新数组,则可以执行以下操作:
NSArray *derivedArray = [originalArray valueForKey:@"foo"];
这只有在你的对象可以处理'-valueForKey:@"foo"'消息时才有效,显然,它只适用于不带参数且返回非零值的方法.