23

我有一个通过内部单个方法调用而变化的方法,我想传递它作为参数变化的方法的方法/签名......这在Objective C中是可能的还是希望太大了为了?

4

3 回答 3

27

NSInvocation 是一个用于包装对象中的方法调用的类。您可以设置选择器(方法签名),按索引设置参数。然后,您可以设置一个目标并调用 invoke 来触发调用,或者不设置目标并使用 invokeWithTarget: 在某种循环中对许多对象调用它。

我认为它有点像这样:

NSInvocation *inv = [[NSInvocation alloc] init];
[inv setSelector:@selector(foo:bar:)];
[inv setArgument:123 atIndex:0];
[inv setArgument:456 atIndex:1];

for (MyClass *myObj in myObjects) {
  [inv invokeWithTarget:myObj];
}

或者,如果您不想将调用对象传递给此方法,您可以使用 SEL 类型来接受选择器(方法签名)。

-(void)fooWithMethod:(SEL)selector;

然后将选择器分配给调用对象,以便在对象上调用它。

于 2009-02-06T09:12:24.050 回答
10

或者,如果您正在使用该fooWithMethod:(SEL)selector方法,只要[myObject performSelector:selector]它没有其他参数就可以了。

有关详细信息,请参阅NSObject

于 2009-02-08T06:05:02.163 回答
3

如前所述,您可以传递要调用的方法的选择器。使用选择器有不同的方法来实际调用该方法:

  1. 使用NSObjects 和方法performSelector:_performSelector:withObject:performSelector:withObject:withObject:
  2. 使用一个NSInvocation对象
  3. 或直接使用objc_msgSendobjc_msgSend_stret
  4. 使用IMP你可以使用的那个方法methodForSelector:

使用哪一种取决于具体情况。如果性能不重要,如果您需要传入 0、1 或 2 个对象,我会继续使用 1。如果performSelector:...方法不匹配,我会选择 2 或 3。由于设置NSInvocation对象需要大量样板代码,我更喜欢 3,但我想这是个人选择的问题,除非存在性能问题。

IMP如果这些方法调用的性能确实很重要,我会使用 3 或 4。除非您可以缓存s ,否则 3 应该更快。但根据您的代码,这可能不可行或没有真正帮助。所以在这里你必须分析代码,看看哪一个更适合你。

于 2010-09-28T10:21:10.380 回答