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

vir*_*wal 1 compiler-construction xcode ios

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

JRG*_*per 5

编译器不知道什么事件.编译器只是将您的高级源代码转换为机器代码.

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

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

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

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

有关更多信息,请阅读Apple关于Run Loops的文档.


Ama*_*mar 5

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

在此处输入图片说明

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

重要的UIApplicationMain是,

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

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

因此,每当您的应用程序中发生诸如单击 aUIButton之类的事件时,该事件就会沿响应者链向下传播,如UIApplication-> UIViewController-> UIView-> 按钮。

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


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

在此处输入图片说明

希望有帮助!

  • 是的,谢谢,这对我有用。 (2认同)