我想写这样的东西:
- (int)someMethod:(SEL)theSelector {
NSObjet *i = func(...);
i = theSelector(i); //replace this
i = func2(...);
return i;
}
所以我有一些我知道的常量函数,可以简单地写。我还有一个未定义的函数,我应该将其作为参数传递。
我不能使用像performSelector:
这样的结构,因为它们甚至在另一个NSRunLoop循环中执行。
由于特定代码,我无法将块传递给此函数。
如何解决这个问题?似乎objc_msgSend
可能会有所帮助,但我不知道如何正确使用它。
答案 0 :(得分:1)
使用NSInvocation。 这是一个示例代码。
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature: [[target class] instanceMethodSignatureForSelector:theSelector]];
[invocation setSelector:theSelector];
[invocation setTarget:target];
[invocation setArgument:&blockUserInfo atIndex:2]; // Argument 2 is the first argument in an NSInvocation, arg0 is 'self' and arg1 is '_cmd'.
[invocation invoke];
[invocation getReturnValue:&success];
希望这有帮助。
亨利
答案 1 :(得分:0)
首先,选择器只是一个方法名称。您需要一个对象来发送它。我将假设它是self
。
在这种情况下最简单的事情是使用performSelector:onObject:
(因为它是一个接受一个对象指针参数的方法):
i = [self performSelector:theSelector withObject:i];
这与直接方法调用相同(performSelector
调用本身的开销除外)。它不是异步地或在延迟或任何事情之后;你很困惑。
如果您想通过objc_msgSend()
知道如何操作:
id (*func)(id, SEL, id) = (id (*)(id, SEL, id))objc_msgSend;
i = func(self, theSelector, i);
请注意,您必须首先将objc_msgSend
强制转换为与底层实现函数匹配的函数指针类型(其开头有两个隐藏参数,self
;以及_cmd
,选择器) 。这与机器代码级别的直接方法调用完全相同。你可以想象这就是编译器编译消息调用的原因。