我有一个通过内部单个方法调用而变化的方法,我想传递它作为参数变化的方法的方法/签名......这在Objective C中是可能的还是希望太大了为了?
3 回答
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;
然后将选择器分配给调用对象,以便在对象上调用它。
或者,如果您正在使用该fooWithMethod:(SEL)selector
方法,只要[myObject performSelector:selector]
它没有其他参数就可以了。
有关详细信息,请参阅NSObject。
如前所述,您可以传递要调用的方法的选择器。使用选择器有不同的方法来实际调用该方法:
- 使用
NSObject
s 和方法performSelector:
_performSelector:withObject:
performSelector:withObject:withObject:
- 使用一个
NSInvocation
对象 - 或直接使用
objc_msgSend
或objc_msgSend_stret
- 使用
IMP
你可以使用的那个方法methodForSelector:
使用哪一种取决于具体情况。如果性能不重要,如果您需要传入 0、1 或 2 个对象,我会继续使用 1。如果performSelector:...
方法不匹配,我会选择 2 或 3。由于设置NSInvocation
对象需要大量样板代码,我更喜欢 3,但我想这是个人选择的问题,除非存在性能问题。
IMP
如果这些方法调用的性能确实很重要,我会使用 3 或 4。除非您可以缓存s ,否则 3 应该更快。但根据您的代码,这可能不可行或没有真正帮助。所以在这里你必须分析代码,看看哪一个更适合你。