当前位置:  开发笔记 > 前端 > 正文

makeObjectsPerformSelector:

如何解决《makeObjectsPerformSelector:》经验,为你挑选了3个好方法。

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



1> Louis Gerbar..:

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

NSArray *newArray = [[NSArray alloc] initWithArray:oldArray copyItems:YES];
[newArray makeObjectsPerformSelector:@selector(doSomethingToObject)];


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

2> Peter Hosey..:

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

没有.

首先,阅读签名:

- (void)makeObjectsPerformSelector:(SEL)aSelector

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

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

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

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



3> Mike Abdulla..:

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

NSArray *derivedArray = [originalArray valueForKey:@"foo"];

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

推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有