iOS应用程序一般都是由友好编辑的代码系统框架(system
frameworks)组成,系统框架提供部分基本infrastructure给拥有app来运行,而你提供自己编排的代码来定制app的外观和表现。由此,明白iOS
infrastructure和它们咋做事对编写app是很有接济的。

Main函数入口

持有基于C编写的app的入口都是main函数,但iOS应用程序有点不相同。不相同就是您不必要为iOS应用程序而协调编排main函数,当您选拔Xcode创造工程的时候就已经提供了。除非一些很是情状,否则你不应该修改Xcode提供的main函数达成。示例代码如下:

#import <UIKit/UIKit.h>
#import "AppDelegate.h"

int main(int argc, char * argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    } 
}

地点实例代码中有一个很主要的函数UIApplicationMain,它至关重即使创办app的几个着力目标来拍卖以下进度:

  1. 从可用Storyboard文本加载用户界面
  2. 调用AppDelegate自定义代码来做一些早先化设置
  3. 将app放入Main Run Loop条件中来响应和拍卖与用户交互爆发的事件

应用程序的架构

iOS应用程序都听从Model-View-Controller的架构,Model顶住储存数据和拍卖事务逻辑,View担当显示数据和与用户交互,Controller是双方的中介,协调ModelView相互合营。它们的电视发布规则如下:

  1. Controller可以访问ModelViewModelView不能互相走访

    MVC Communication – Reference from Stanford University.png

  2. View与用户交互发生事件时,使用target-action办法来处理

    MVC Communication – Reference from Stanford University.png

  3. View急需处理局地特殊UI逻辑或获取数据源时,通过delegatedata source艺术提交Controller来处理

    MVC Communication – Reference from Stanford University.png

  4. Model不可能直接与Controller通信,当Model有多少更新时,可以透过NotificationKVO (Key Value Observing)来通知Controller更新View

    MVC Communication – Reference from Stanford University.png

刺探iOS的MVC设计情势之后,大家从下图来打探在MVC情势下iOS应用程序有啥根本目的以及它们职责重在是哪些?

The Structure of an App.png

  • UIApplication对象
    用户与iOS设备交互时发生的风云(Multitouch 伊芙nts,Motion
    伊芙nt,Remote Control 伊芙nt)交由UIApplication目标来散发给control
    objects
    (UIControl)对应的target
    objects
    来处理并且管理整个事件循环,而有的有关app运行时根本事件委托给app delegate来处理。

  • App
    delegate
    对象
    App delegate目的听从UIApplicationDelegate共谋,响应app运行时紧要事件(app启动、app内存不足、app终止、切换到另一个app、切回app),首要用于app在启动时伊始化一些首要数据结构;例如,先导化UIWindow,设置有些性质,为window添加rootViewController

  • View
    controller
    对象
    View Controller有一个view属性是view层次结构中的根view,你可以添加子view来打造复杂的view;controller有一些viewDidLoadviewWillAppear等办法来管理view的生命周期;由于它一连UIResponder,所有还会响应和处理用户事件。

  • Documents和data
    model对象
    data
    model
    对象首要用来储存数据。例如,饿了么app在追寻切换地址后,有历史记录搜索地址历史,当app下次启动时,读取和显示搜索地址历史。
    document目的(继承UIDocument)用来管理一些或享有的data
    model对象。document对象并不是必须的,但提供一种有益的艺术来分组属于单个文件或多少个文本的数码。

  • UIWindow对象
    UIWindow指标位于view层次结构中的最顶层,它充当一个骨干容器而不呈现内容,要是想显示内容,添加一个content
    view到window。
    它也是继续UIResponder,所以它也是会响应和拍卖用户事件。

  • Viewcontrollayer对象
    View对象可以透过addSubview和removeFromSuperview
    等措施管理view的层次结构,使用layoutIfNeeded和setNeedsLayout等形式布局view的层次结构,当你发现系统提供view已经满意不断你想要的外观须求时,可以重写drawRect方法或通过layer属性来组织复杂的图表外观和卡通。还有一些,UIView也是继承UIResponder,所以也可以处理用户事件
    Control目的一般就是处理特定类型用户交互的View,常用的有button、switch、text
    field等。
    除却使用ViewControl来打造view层次结构来震慑app外观之外,还足以行使Core
    Animation框架的Layer目的来渲染view外观和打造复杂的动画片。

Main Run Loop

一个iOS应用程序的main run
loop
主要功效是拍卖所有与用户相关的风云。UIApplication目的在启动时就安装main
run loop和使用它来处负责人件和翻新基于view的界面。正如它名字所示,main run
loop是运行在应用程序的主线程。那样就确保与吸纳到用户相关的轩然大波被有序地处理。

下图突显main run
loop的架构和用户事件结尾是怎么被应用程序处理。当用户与设施交互时,系统就会转变与互动关联的事件,然后被应用程序的UIKit通过一个特殊的端口来散发。应用程序把事件放入队列,然后逐个分发到main
run
loop来执行。UIApplication目的是第二个目标吸收到事件,然后决定如何处理它。一个touch
event
见惯司空都被分发到main
window对象,然后依次分发到暴发触碰的view。其余event的吸收事件目的路径可能有点差异。

Main Run Loop from Apple Document

大部分的轩然大波经过运用main run
loop来散发,但有点不是。有些事件被发送到一个delegate对象或传递到你提供的block中。想精晓越来越多如何处理一大半档次的事件,其中包罗touch、remote
control、motion、accelerometer和gyroscopic等事件,请查阅Event Handle
Guide for
iOS

应用程序的图景和多职务

突发性系统会从app一种情景切换另一种情状来响应系统发生的风浪。例如,当用户按下home键、电话打入、或其他中断爆发时,当前运作的应用程序会切换状态来响应。应用程序的情景有以下二种:

App State from Apple Document

  • Not running:app还没运行
  • Inactive:app运行在foreground但尚未收受事件
  • Active:app运行在foreground和正在接受事件
  • Background:运行在background和正在履行代码
  • Suspended:运行在background但未曾履行代码

绝大部分发出意况转换时都会调用delegate目的对应的章程来响应app的气象改变。下边汇总了delegate目标的保有办法,当app状态爆发转换时,你恐怕会选用到它们。

  • application:willFinishLaunchingWithOptions:
    那一个措施是你在启动时的首先次机会来推行代码
  • application:didFinishLaunchingWithOptions:
    那么些法子允许你在突显app给用户从前实施最终的先导化操作
  • applicationDidBecomeActive:
    app已经切换来active状态后须要执行的操作
  • applicationWillResignActive:
    app将要往日台切换来后台时须求执行的操作
  • applicationDidEnterBackground: – app已经进去后台后需求执行的操作
  • applicationWillEnterForeground:
    app将要从后台切换来前台必要执行的操作,但app还不是active状态
  • applicationWillTerminate: – app将要停止时必要实践的操作

后天讲下app启动、来回切换app和锁屏时情况的切换和调用对应如何delegate对象的措施:

  • app启动和active/inactive

    Launch and active/inactive from Apple WWDC 2011 Session

如图所示,当app启动时,首先由`not running`状态切换到`inactive`状态,此时调用`application:didFinishLaunchingWithOptions:`方法;然后由`inactive`状态切换到`active`状态,此时调用`applicationDidBecomeActive:`方法。

Launch and active/inactive 2 from Apple WWDC 2011 Session

当app爆发搁浅时,由active情景切换来inactive动静,此时调用applicationWillResignActive:方法。

  • 过往切换app

    Switch from an app from Apple WWDC 2011 Session

如图所示,当切换到另一个app时,由状态`active`切换到`inactive`,此时调用`applicationWillResignActive:`方法;然后从`inactive`状态切换到`running`状态,此时调用`applicationDidEnterBackground:`方法。

Switch to an app from Apple WWDC 2011 Session

而当切换回本来的app时,由running状态切换来inactive意况,此时调用applicationWillEnterForeground:方法,然后由inactive情景切换到active状态,调用applicationDidBecomeActive:方法。

  • 锁屏

    Device lock from Apple WWDC 2011 Session

如何所示,当手机锁屏时,由状态`active`切换到`inactive`,此时调用`applicationWillResignActive:`;然后再由`inactive`状态切换到`running`状态,此时调用`applicationDidEnterBackground:`方法。

更加多关于app状态切换以及调用app delegate怎样方法,请观望WWDC 2011
Session的session_320__adopting_multitasking_in_your_app视频。

应用程序的终止

系统时常是为其余app启动时由于内存不足而回收内存最终索要为止应用程序,但有时候也会是由于app很长日子才响应而停下。借使app当时运作在后台并且没有间断,系统会在应用程序终止以前调用applicationWillTerminate:来保存用户的有些要害数据以便下次启动时恢复生机到app原来的情状。

总结

正文总括了iOS应用程序从启动到停止进程中有何样首要目的在加入,以及当用户与系统互相时暴发事件时,系统运用main
run
loop来管总管件循环,决定将事件交给系统怎么着对象处理和怎么着处理。而当app启动、来回切换app和锁屏时,app的情况怎么着切换和调用对应的怎么着app delegate目的来处理。

推而广之阅读

App Programming Guide for
iOS

Developing iOS 7 App for iPhone and
iPad

深入了然RunLoop
Objective-C Autorelease Pool
的兑现原理

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图