我想知道编译器用来知道事件发生的步骤,或者可能是算法?例如,它如何知道按钮已被按下?
2 回答
编译器对事件一无所知。编译器只是将您的高级源代码翻译成机器代码。
这是在运行时的范围内,它受操作系统(iOS)、您创建的控制器(视图控制器)等影响。
iOS 使用“运行循环”的概念来处理和处理事件。每个 iOS 应用程序总是至少有一个这样的运行循环,指定为“主”操作队列/线程,在多线程应用程序中可能有几个。
简而言之,主运行循环有点像这样:
- 运行循环开始
- 输入源(即通过用户交互、计时器事件等)将事件传递给运行循环上的相应事件处理程序——这可能会导致调用 IBAction(由您创建的方法),例如
- 发生处理和事件导致的操作(即运行您的 IBAction 代码)
- 在循环结束时,发生引用计数任务(自动释放的对象被释放等)
- 运行循环结束
- 然后运行循环可能会重复(如在 main 的情况下)
有关更多信息,您应该阅读Apple 关于 Run Loops 的文档。
扩展 JRG-Developer 的答案,当您的应用程序启动时会发生以下事件。
iOS 将为您的应用程序创建一个进程,并将调用入口点main()
函数。该main()
函数通过调用将控制权移交给UIKit
框架UIApplicationMain
,它在初始化您的应用程序和准备运行时完成了大部分工作。您可以看到过程中发生的各种初始化步骤(如上图所示)。
重要的UIApplicationMain
是,
它还设置主事件循环,包括应用程序的运行循环,并开始处理事件。
iOS 通常为事件维护一个队列,然后将这些事件路由到相应应用程序的事件循环。UIApplication
, UIViewController
,UIWindow
和UIView
都是 的子类UIResponder
。该类UIResponder
为响应和处理事件的对象定义了一个接口。
因此,每当您的应用程序中发生事件(例如单击 a )时,该事件都会像-> -> -> 按钮UIButton
一样沿响应者链传播。UIApplication
UIViewController
UIView
对于您,您已经注册了通过调用方法UIButton
响应事件的选择器。addTarget:action:forControlEvents:
运行时将调用此特定操作选择器,以便您可以采取必要的操作。
下图解释了事件在主运行循环中是如何处理的
希望有帮助!