2

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

4

2 回答 2

12

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

这是在运行时的范围内,它受操作系统(iOS)、您创建的控制器(视图控制器)等影响。

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

简而言之,主运行循环有点像这样:

  1. 运行循环开始
  2. 输入源(即通过用户交互、计时器事件等)将事件传递给运行循环上的相应事件处理程序——这可能会导致调用 IBAction(由您创建的方法),例如
  3. 发生处理和事件导致的操作(即运行您的 IBAction 代码)
  4. 在循环结束时,发生引用计数任务(自动释放的对象被释放等)
  5. 运行循环结束
  6. 然后运行循环可能会重复(如在 main 的情况下)

有关更多信息,您应该阅读Apple 关于 Run Loops 的文档

于 2013-09-11T10:23:34.797 回答
7

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

在此处输入图像描述

iOS 将为您的应用程序创建一个进程,并将调用入口点main()函数。该main()函数通过调用将控制权移交给UIKit框架UIApplicationMain,它在初始化您的应用程序和准备运行时完成了大部分工作。您可以看到过程中发生的各种初始化步骤(如上图所示)。

重要的UIApplicationMain是,

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

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

因此,每当您的应用程序中发生事件(例如单击 a )时,该事件都会像-> -> -> 按钮UIButton一样沿响应者链传播。UIApplicationUIViewControllerUIView

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


下图解释了事件在主运行循环中是如何处理的

在此处输入图像描述

希望有帮助!

于 2013-09-11T11:01:10.850 回答