Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Objective-C中是否可以将方法作为参数传递?_Objective C_Method Signature - Fatal编程技术网

在Objective-C中是否可以将方法作为参数传递?

在Objective-C中是否可以将方法作为参数传递?,objective-c,method-signature,Objective C,Method Signature,我有一个方法,它随内部单个方法调用的不同而变化,我希望将其变化的方法/签名作为参数传递给。。。这在Objective C中是可能的,还是希望太多?NSInvocation是一个用于在对象中封装方法调用的类。您可以设置选择器(方法签名),按索引设置参数。然后可以设置一个目标并调用invoke来触发调用,或者不设置目标并在某种循环中使用invokeWithTarget:来对许多对象调用它 我认为它有点像这样: NSInvocation *inv = [[NSInvocation alloc] ini

我有一个方法,它随内部单个方法调用的不同而变化,我希望将其变化的方法/签名作为参数传递给。。。这在Objective C中是可能的,还是希望太多?

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类型接受选择器(方法签名)


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

或者如果您使用的是
fooWithMethod:(SEL)选择器
方法,只要对它执行
[myObject performSelector:selector]
,如果它没有其他参数


请参阅。

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

  • 使用
    NSObject
    s
    performSelector:
    performSelector:withObject:
    performSelector:withObject:withObject:
    方法
  • 使用
    NSInvocation
    对象
  • 或者直接使用
    objc\u msgSend
    objc\u msgSend\u stret
  • 使用该方法的
    IMP
    ,您可以使用
    methodForSelector:
  • 到底用哪一种取决于具体情况。如果性能不重要,如果需要传入0、1或2个对象,我会使用1。如果
    性能选择器:…
    方法不匹配,我会选择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;