makeObjectsPerformSelector:

All*_*lyn 17 arrays cocoa objective-c nsarray

我想让数组中的所有对象执行选择器.我已经发现了适当命名的makeObjectsPerformSelector:方法,但我有一个问题.如果我在数组上使用它,它会更改现有数组还是返回一个新数组?如果它修改了现有对象,那么在应用选择器的情况下返回新数组的最简单方法是什么?

Lou*_*arg 29

makeObjectsPerformSelector:将针对数组中的每个对象运行该选择器.如果选择器修改了这些对象,则会修改它们.它没有返回任何东西.现在,有一个catch,默认情况下,Cocoa中的大多数副本都是浅拷贝,这意味着你得到一个新的数组,但它指向的底层对象是相同的对象.您将需要使用initWithArray:copyItems来复制根级项目.如果你想要一个包含已更改对象的新数组以及旧数组,请执行以下操作:

NSArray *newArray = [[NSArray alloc] initWithArray:oldArray copyItems:YES];
[newArray makeObjectsPerformSelector:@selector(doSomethingToObject)];
Run Code Online (Sandbox Code Playgroud)

  • 传递给`-makeObjectsPerformSelector:`的选择器不带参数.(它位于[文档](https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html).)然而,您的选择器如图所示. (4认同)

Pet*_*sey 15

如果我在数组上使用它,它会更改现有数组还是返回一个新数组?

没有.

首先,阅读签名:

- (void)makeObjectsPerformSelector:(SEL)aSelector
Run Code Online (Sandbox Code Playgroud)

void在它之后没有星星,意味着"不会返回任何东西".

其次,请注意,这是NSArray的一种方法,它是一个不可变类.因此,makeObjectsPerformSelector:不会改变接收阵列,因为这是不可能的.

有NSMutableArray,因为它是NSArray的子​​类,所以它继承makeObjectsPerformSelector:.但是,如果NSMutableArray更改了该方法的行为,则其文档将具有自己的方法列表(请参阅init各种类文档中的许多定义).没有这样的列表,因此您可以安全地(并且正确地)推断其-[NSMutableArray makeObjectsPerformSelector:]工作原理与完全相同-[NSArray makeObjectsPerformSelector:].

对象可以自己修改以响应您的消息,但是数组本身将包含与makeObjectsPerformSelector:之前相同的对象.


Mik*_*lah 7

除了其他答案之外,如果您确实需要创建一个具有调用方法结果的新数组,则可以执行以下操作:

NSArray *derivedArray = [originalArray valueForKey:@"foo"];
Run Code Online (Sandbox Code Playgroud)

只有在你的对象可以处理'-valueForKey:@"foo"'消息时才有效,显然,它只适用于不带参数且返回非零值的方法.