调用objc_msgSend后如何继续

时间:2012-04-20 19:59:21

标签: objective-c metaprogramming objective-c-runtime

我正在使用objective-C进行元编程,并尝试自动化一些应用程序功能。因此,我没有更改应用程序的源代码文件和视图控制器,而是从我正在管理的另一个文件中获取UI导航堆栈,我使用Objective-C Runtime Reference来查找可点击的UI元素和操作。例如,对于一个按钮,我找到了目标和动作,并调用objc_msgSend以编程方式触发事件。

step =(NSObject *)objc_msgSend(element.target,NSSelectorFromString(element.action));

但是我需要在操作完成后收到通知,或者换句话说,我需要等到操作完成后再继续我的自动化。我在考虑使用NSNotificationCenter

//举起一个活动 [[NSNotificationCenter defaultCenter] postNotificationName:FIRE_EVENT_NOTIFICATION object:self];

但看起来不像。

我甚至考虑使用Categories或 所以我不确定是否还有等待objc_msgSend以及我应该在哪里继续。

1 个答案:

答案 0 :(得分:1)

目前还不完全清楚你要做的是什么以及你遇到的确切问题,但我会回答你的问题。

如果我理解正确你试图触发与UI元素相关联的动作,可能就像按下按钮一样。您在element中引用了该元素,并且您希望在元素action上调用关联的target。以下假定操作为IBAction

最简单的方法可能是:

[element.target performSelector:element.action];

注意: element.action几乎肯定会返回SEL(选择器)而不是NSString,因此无需通过{{1}运行它}。

通常情况下,NSSelectorFromString()事件会将点击的元素作为参数接收,所以我认为您可能会这样做:

IBAction

[element.target performSelector:element.action withObject:element]; 没有返回值,因此在方法返回时没有任何内容可以存储。

只有在被调用的方法运行完成后,

IBActionperformSelector:才会返回。您不应该组织某种行动完成的通知。

但是,如果您正在调用的操作是在另一个线程上启动代码,那么在按下按钮的结果完成之前,被调用的操作可能会返回。如果不了解正在运行的代码,就很难监控。

如果出于某种原因,您 使用performSelector:withObject:,那么您将使用以下内容:

objc_msgSend

objc_msgSend(element.target, element.action, element); 类似,performSelector:只会在被调用方法运行完成时返回。

希望我理解你的问题,我的回答是有道理的,但我完全有可能在错误的树上狂奔。