0%

App启动后发生了什么

应用启动及事件分发

App在启动之后, 会立即与负责传底层递用户事件的系统组件建立连接. 由于App必须依次单独的处理这些底层事件, 所以底层事件在发生之后会首先被加入到一个event queue中, 然后按照first-in first-out的顺序派发到App中.

一旦用户界面初始化完成, App就开始由外部用户事件驱动. Application object会从event queue中取出队首对象, 并将其转换成一个UIEvent对象, 然后将其分发给应用内的其他对象进行处理. 这个过程会一直持续到应用程序终止.

事件响应及应用状态更新

App加载完成后, 还会设置一组负责绘制用户界面和处理事件的核心对象, 包括UIWindow和各种类型的UIView. 当Application object从event queue中获取到一个用户事件后, 会先将事件发送到用户事件发生的UIWindow, 然后UIWindow会将事件下发给合适的View进行处理.

在处理事件的过程中, view会通过一系列动作来更新应用的状态和数据, 当这些动作完成之后, 控制权会重新交还给Application object, 以便继续从event queue中获取下一个事件.

事件的传递和响应

注: 这里所说的事件, 只是用户通过手指与屏幕交互的事件(Touch events), 不包括其他类型的事件.

上面说过, 当Application object从event queue中获取到一个用户事件后, 会首先将事件发送到用户事件发生的UIWindow, 然后UIWindow会将事件下发给合适的View进行处理.

严格来说, 这个过程可以分解为两步, 首先是寻找交互事件发生的View, 然后才是选择处理事件的first responder. 这里要注意的事, 事件发生的View, 并不一定会处理该事件, 也就不是该事件的first responder.

寻找用户交互的”案发现场”

UIKit使用基于view的hit-testing机制来确定交互事件的发生地. hit-testing机制主要包括两个方法:hitTest:withEvent:pointInside:withEvent:.

hit-testing机制的主要调用流程如下:

  1. 首先调用当前view的*pointInside:withEvent:*方法, 判断触摸点是否在当前视图范围内.
  2. pointInside:withEvent:返回NO, 则hitTest:withEvent: 返回nil, 说明触摸点不在当前视图可视范围内,对当前视图及视图层级的遍历终止;
  3. 若*pointInside:withEvent:返回YES, 则继续按照视图层级从上到下遍历当前视图的所有子视图, 调用其hitTest:withEvent:*方法, 直到某个子视图返回非nil的视图对象, 流程结束.
  4. 若所有子视图都返回nil, 则当前view的*pointInside:withEvent:*方法返回self.
    

概括来说, 事件发生地的寻找是通过由大到小,层层递进遍历的策略来实现的.

寻找First responder

在iOS中, 下面图中的对象都可以是事件的响应者:

在定位到事件发生的view之后, 如果该view能够处理改该事件, 则事件交付其进行处理. 如果该view不能处理该事件, 则会调用其nextResponder方法, 将事件传递下responder chain的下一个节点上, 直到找到事件的First responder, 如果该事件在整个responder chain都无法处理, 则会被丢弃.

iOS(left)和OSX(right)中的responder chain

常用名词解释

  • UITouch: An object representing the location, size, movement, and force of a touch occurring on the screen.
  • UIEvent: An object that describes a single user interaction with your app, including touch events, motion events, remote-control events, and press events.
  • UIResponder: An abstract interface for responding to and handling events.
  • Application object: An application object is responsible for the initial routing of user events and overall management of a running application. When an application is launched, it creates the application object in its main function.
  • Main event loop: In the main event loop, an application continuously routes incoming events to objects for handling and, as a result of that handling, updates its appearance and state.
  • First responder: the most appropriate responder object to handle the event.

fastlane是一套ruby脚本工具, 用于实现iOS或Android的持续集成及自动化发布. fastlane的安装及更多相关介绍参见其Github:fastlane)).

本文使用的fastlane版本为2.47.0. 低版本可能会产生各种莫名其妙的问题. 配置fastlane时最好先翻墙,原因你懂的.

本文主要介绍使用fastlane上传应用数据到ITC.

阅读全文 »

fastlane是一套ruby脚本工具, 用于实现iOS或Android的持续集成及自动化发布. fastlane的安装及更多相关介绍参见其Github:fastlane)).

本文使用的fastlane版本为2.47.0. 低版本可能会产生各种莫名其妙的问题. 配置fastlane时最好先翻墙,原因你懂的.

本文主要介绍使用fastlane插件firim的使用.

阅读全文 »

fastlane是一套ruby脚本工具, 用于实现iOS或Android的持续集成及自动化发布. fastlane的安装及更多相关介绍参见其Github:fastlane)).

本文使用的fastlane版本为2.47.0. 低版本可能会产生各种莫名其妙的问题. 配置fastlane时最好先翻墙,原因你懂的.

本文主要介绍使用fastlane命令行进行ipa打包及导出.

阅读全文 »

fastlane是一套ruby脚本工具, 用于实现iOS或Android的持续集成及自动化发布. fastlane的安装及更多相关介绍参见其Github:fastlane)).
本文使用的fastlane版本为2.35.0. 配置fastlane时最好先翻墙,原因你懂的.

本文介绍fastlane的”截图套壳”工具 - frameit.

阅读全文 »

fastlane是一套ruby脚本工具, 用于实现iOS或Android的持续集成及自动化发布. fastlane的安装及更多相关介绍参见其Github:fastlane)).
本文使用的fastlane版本为2.35.0. 配置fastlane时最好先翻墙,原因你懂的.

本文介绍fastlane的自动截图工具 - snapshot.

阅读全文 »

App Store审核分机审和人审, 被4.3卡了这么久, 终于搞清楚机审是怎么审的了!!!

为什么写这篇文章

之前在cocoaChina上投过一篇iOS基于mvc的项目重构总结。时过一年,现在回头再看,发现当初对于MVP的理解十分浅薄,再加上这几天在论坛上又看到了谈MV“X”模式的文章,发现有些文章其实还是犯了和我当初一样的错误. 为了对被我误导过的同学负责, 所以才有了这篇文章.

声明一下, 作者并不是架构师,也不是所谓的大神. 此文仅仅为一篇学习总结.

注: 本文谈论的MVP都指的是Passive View模式.

阅读全文 »

在创建一个objc对象时,alloc负责分配内存,init负责对对象进行初始化。也就是说,init其实就是其他语言中的构造函数。

但是如果需要在构造函数中调用父类与子类同名的对象方法时,objc和C++两种语言输出的结果却截然不同。

阅读全文 »

在iOS中绘图技术主要有UIKit, Quartz 2D,Core Animation和OpenGL ES. 其中Core Animation提供动画实现. OpenGL ES是OpenGL针对嵌入式设备的简化版本, 可以绘制高性能的2D和3D图形. 这里重点介绍UIKit和Quartz 2D.

  1. UIKit: 高级别的图形接口, 提供了基于Objective-C和Swift的API. 能够访问绘图,动画,字体,图片等内容.
  2. Quartz 2D: iOS和OSX环境下的2D绘图引擎. 包括基于路径的绘图, 透明度绘图,遮盖, 阴影, 透明层, 颜色管理, 防锯齿渲染, 生成PDF, 以及PDF元数据的相关处理. Quartz 2D也被称为Core Graphics, 缩写前缀为CG.
阅读全文 »