在Objective-C中是否可以将方法作为参数传递?
我有一个方法,它随内部单个方法调用的不同而变化,我希望将其变化的方法/签名作为参数传递给。。。这在Objective C中是可能的,还是希望太多?NSInvocation是一个用于在对象中封装方法调用的类。您可以设置选择器(方法签名),按索引设置参数。然后可以设置一个目标并调用invoke来触发调用,或者不设置目标并在某种循环中使用invokeWithTarget:来对许多对象调用它 我认为它有点像这样:在Objective-C中是否可以将方法作为参数传递?,objective-c,method-signature,Objective C,Method Signature,我有一个方法,它随内部单个方法调用的不同而变化,我希望将其变化的方法/签名作为参数传递给。。。这在Objective C中是可能的,还是希望太多?NSInvocation是一个用于在对象中封装方法调用的类。您可以设置选择器(方法签名),按索引设置参数。然后可以设置一个目标并调用invoke来触发调用,或者不设置目标并在某种循环中使用invokeWithTarget:来对许多对象调用它 我认为它有点像这样: NSInvocation *inv = [[NSInvocation alloc] ini
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类型接受选择器(方法签名)
然后将选择器分配给调用对象,以便在对象上调用它。或者如果您使用的是
fooWithMethod:(SEL)选择器
方法,只要对它执行[myObject performSelector:selector]
,如果它没有其他参数
请参阅。如前所述,您可以传递要调用的方法的选择器。使用选择器有多种方法可以实际调用该方法:
NSObject
sperformSelector:
,performSelector:withObject:
和performSelector:withObject:withObject:
方法NSInvocation
对象objc\u msgSend
或objc\u msgSend\u stret
IMP
,您可以使用methodForSelector:
性能选择器:…
方法不匹配,我会选择2或3。由于设置NSInvocation
对象需要大量样板代码,我更喜欢3,但我想这是个人选择的问题,除非存在性能问题
如果这些方法调用的性能确实重要,我会使用3或4。3应该更快,除非您可以缓存
IMP
s。但是,根据您的代码,这可能是不可行的,或者没有真正的帮助。因此,您必须在这里分析代码,看看哪一个更适合您。我刚刚尝试了这一点,但在没有像这样设置方法签名的情况下无法使其工作:NSMethodSignature*sig=[self-methodSignatureForSelector:@selector(foo:bar:)]代码>NSInvocation*inv=[NSInvocation invocationWithMethodSignature:sig]代码>从那里它应该可以工作。另外,确保从2开始参数索引:索引0和1分别表示隐藏参数self和_cmd;您应该直接使用目标和选择器属性设置这些值。对消息中通常传递的参数使用索引2或更大的值。
-
-(void)fooWithMethod:(SEL)selector;