在同一个线程中调用未定义的方法?

时间:2014-08-22 19:22:27

标签: ios function selector param performselector

我想写这样的东西:

- (int)someMethod:(SEL)theSelector {

    NSObjet *i = func(...);
    i = theSelector(i); //replace this
    i = func2(...);
    return i;
}

所以我有一些我知道的常量函数,可以简单地写。我还有一个未定义的函数,我应该将其作为参数传递。

我不能使用像performSelector:这样的结构,因为它们甚至在另一个NSRunLoop循环中执行。

由于特定代码,我无法将块传递给此函数。

如何解决这个问题?似乎objc_msgSend可能会有所帮助,但我不知道如何正确使用它。

2 个答案:

答案 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,选择器) 。这与机器代码级别的直接方法调用完全相同。你可以想象这就是编译器编译消息调用的原因。