编译器如何知道按下了按钮?

时间:2013-09-11 10:16:15

标签: ios xcode compiler-construction

我想知道编译器用来知道发生的事件的步骤,或者算法算法?例如,它如何知道已按下按钮?

2 个答案:

答案 0 :(得分:5)

编译器 对事件一无所知。编译器只是将您的高级源代码转换为机器代码。

这属于 运行时 的范围,受操作系统(iOS),您创建的控制器(视图控制器)等影响

iOS使用“运行循环”的概念来处理和处理事件。每个iOS应用程序将始终至少有一个这样的运行循环,指定为“主”操作队列/线程,并且可能在多线程应用程序中有几个。

简而言之,主运行循环的工作方式如下:

  1. 运行循环启动
  2. 输入源(即通过用户交互,计时器事件等)将事件传递给运行循环上的相应事件处理程序 - 这可能导致调用IBAction(由您创建的方法),例如
  3. 处理和由事件引起的操作发生(即运行您的IBAction代码)
  4. 在循环结束时,引用计数任务发生(自动释放的对象被释放等)
  5. 运行循环结束
  6. 然后可以重复运行循环(如在main的情况下)
  7. 有关详细信息,请阅读Apple's documentation on Run Loops

答案 1 :(得分:3)

扩展JRG-Developer的答案,在您的应用程序启动后发生以下事件。

enter image description here

iOS将为您的应用创建一个流程,将调用入口点main()功能。 main()函数通过调用UIKit来控制UIApplicationMain框架,UIApplication执行初始化应用并准备运行的大部分工作。您可以在流程中看到各种初始化步骤(如上图所示)。

UIApplicationMain所做的重要事情是,

  

它还设置主事件循环,包括应用程序的运行循环,并开始处理事件。

iOS通常维护事件队列,然后将这些事件路由到相应应用程序的事件循环。 UIViewControllerUIWindowUIViewUIResponder都是UIResponder的子类。 UIButton类为响应和处理事件的对象定义了一个接口。

因此,每当您的应用中发生事件(例如点击UIApplication)时,该事件就会在响应者链中传播,如UIViewController - > UIView - > {{1} } - GT;按钮

对于UIButton您已注册选择器,通过调用addTarget:action:forControlEvents:方法来响应事件。运行时将调用此特定操作选择器,以便您可以采取必要的操作。


下图说明了如何在主运行循环中处理事件

enter image description here

希望有所帮助!