IOS的APP结构、生命周期、main

来源:互联网 发布:政务大数据解决方案 编辑:程序博客网 时间:2024/05/29 06:33

从Android转型从事IOS研发,发现很多东西都万变不离其中,这里根据的是自己的了解,做一个笔记(好记性不如烂笔头)。

(本文章基于的文档是IOS 8.3)

1、IOS的APP结构:

iOS应用程序使用模型-视图-控制器架构(Model-View-Controller)。

这种模式将应用程序的数据和业务逻辑与数据的视觉呈现分离。

这种架构是至关重要的创建应用程序,可以运行在不同的屏幕大小的不同设备。



其实,苹果的document对其解释的非常清楚,并对相应的Object做了非常详细的解说。(以下是自己的理解,不是十分的完善,具体的请看苹果的官方文档)

  • UIApplication object对象管理事件循环和其它高级应用程序的行为。它还报告了关键的应用程序转换和一些特殊的事件(如传入的推送通知)。
  • App delegate objectApp deletegate是代码的核心。这个对象在UIApplication对象串联处理应用程序初始化,该对象也是唯一一个在每个应用程序中存在的,所以它经常被用来建立应用程序的初始数据结构。 
  • Documents and data model objects数据模型对象存储您的应用程序的内容,是特定于您的应用程序。
  • View controller objects View Controller控制器管理您的应用程序的内容在屏幕上演示。
  • UIWindow object一个UIWindow对象在屏幕上呈现一个或多个视图。Windows使用UIApplication对象事件传送给你的视图和视图控制器。
  • View objects,control objects, and layer objects 视图和控件提供的可视化表示应用程序的内容。

2、在主循环中处理事件:


看图应该就可以了解,就不做多解释了。

3、IOS应用程序的执行状态:


  • Not running未运行)     程序没启动。
  • Inactive(未激活)           程序在前台运行,不过没有接收到事件。在没有事件处理情况下程序通常停留在这个状态。
  • Active(激活)                 程序在前台运行而且接收到了事件。这也是前台的一个正常的模式。
  • Backgroud(后台)          程序在后台而且能执行代码,大多数程序进入这个状态后会在在这个状态上停留一会。时间到之后会进入挂起状态(Suspended)。有的程序经过特殊的请求后可以长期处于Backgroud状态。
  • Suspended(挂起)         程序在后台不能执行代码。系统会自动把程序变成这个状态而且不会发出通知。当挂起时,程序还是停留在内存中的,当系统内存低时,系统就把挂起的程序清除掉,为前台程序提供更多的内存。

-(BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions{</span>    //这个方法是你的应用程序在启动时执行代码的第一次机会。</span>    NSLog(@"%s",__func__);    return YES;}- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {</span>    <span style="background-color: rgb(153, 255, 153);">//此方法允许您在应用程序显示给用户之前执行任何最终的初始化。</span>    NSLog(@"%s",__func__);    return YES;}- (void)applicationDidBecomeActive:(UIApplication *)application {</span>    //让你的应用程序知道它即将成为前台应用程序。</span>    NSLog(@"%s",__func__);}- (void)applicationWillResignActive:(UIApplication *)application {</span>    //让你知道你的程序是远离的前台。用这种方法把你的应用程序放在静态的状态。</span>    NSLog(@"%s",__func__);}- (void)applicationDidEnterBackground:(UIApplication *)application {</span>    //让你知道你的应用程序正在后台运行,可以随时暂停。</span>    NSLog(@"%s",__func__);}- (void)applicationWillEnterForeground:(UIApplication *)application {</span>    //让你知道你的应用程序是从后台进入前台,但它是不活跃。</span>    NSLog(@"%s",__func__);}- (void)applicationWillTerminate:(UIApplication *)application {</span>    //让你知道你的应用程序正在被终止。如果你的应用程序被暂停,该方法不会被调用。<span style="white-space:pre"></span>    <span style="font-family: Arial, Helvetica, sans-serif;">NSLog(@"%s",__func__);}</span>

对官方文档中的方法对应的方法中键入NSLog打印。

现在启动程序看看执行的顺序:

启动程序

2015-10-29 20:58:18.350 AppLifeCycle[3055:360067] -[AppDelegate application:willFinishLaunchingWithOptions:]

2015-10-29 20:58:18.351 AppLifeCycle[3055:360067] -[AppDelegate application:didFinishLaunchingWithOptions:]

2015-10-29 20:58:18.412 AppLifeCycle[3055:360067] -[AppDelegate applicationDidBecomeActive:]

单击home键(退回到手机桌面)

2015-10-29 20:58:20.395 AppLifeCycle[3055:360067] -[AppDelegate applicationWillResignActive:]

2015-10-29 20:58:20.938 AppLifeCycle[3055:360067] -[AppDelegate applicationDidEnterBackground:]

单击home键后,再打开程序(接上一步,从手机桌面进入程序,)

2015-10-29 20:58:22.421 AppLifeCycle[3055:360067] -[AppDelegate applicationWillEnterForeground:]

2015-10-29 20:58:22.935 AppLifeCycle[3055:360067] -[AppDelegate applicationDidBecomeActive:]

双击home键后,再打开程序(在程序中,直接双击home键,在进入程序)

2015-10-29 20:58:25.385 AppLifeCycle[3055:360067] -[AppDelegate applicationWillResignActive:]

2015-10-29 20:58:27.496 AppLifeCycle[3055:360067] -[AppDelegate applicationDidBecomeActive:]

4、加载程序:

对于大多数从培训班里出来或者是自学IOS的可能连程序是如何加载到前台的也不知道,已经曾经在C或者Java中接触到的main函数,在IOS中时怎么使用的更不清楚,只知道code,却对这些并不了解。

//  main.m//  AppLifeCycle////  Created by ma c on 15/10/29.//  Copyright (c) 2015年 Bonway. All rights reserved.#import <UIKit/UIKit.h>#import "AppDelegate.h"int main(int argc, char * argv[]) {    @autoreleasepool {        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));    }}

  • main函数中的 int argc,char *argv[ ],大家应该在控制台的oc代码中也见过,这里就不说了。
  • @autoreleasepool 自动释放池,对于每一个Runloop, 系统会隐式创建一个Autorelease pool(自然会有多个Autorelease pool),这样所有的release pool会构成一个象CallStack一样的一个栈式结构,在每一个Runloop结束时,当前栈顶的Autorelease pool会被销毁,这样这个pool里的每个Object会被release。
  • UIApplicationMain中的四个参数:
  • argc和 argc[ ]是从前面的参数带过来的,就不多说了。
  • 第三个参数:其底层是principalClassName:这个参数标识了应用程序的类的名称。是负责运行应用程序的类。
  • 第四个参数:其底层是delegateClassName:看名字就知道,这个是应用程序类的代理类 。应用程序的代理负责管理系统和你的代码之间的高层次的互动
当我们创建一个新的IOS project时,系统默认的会给我们创建出一个Main.storyboard,加载应用程序的主用户界面文件就是UIapplicationMain做的事,应用程序storyboard.main的文件名应该在应用程序的Info.plist文件中的Main storyboard file base name键值中设定。

通常情况下,Xcode会在你创建项目时创建相应键的值,但可以根据需要进行更改。 

如果主要.main文件存在,就会在.main文件对象里寻找Application对象和连接它的delegate。此函数会根据principalClassName创建UIApplication对象,然后根据delegateClassName创建一个delegate对象,并将UIApplication对象中的delegate属性设置为delegate对象。 

当你不想使用系统自带的storyboard.main时,可以在图中,将main删除掉(删除一处,另一处相对应的将自动删除)。

1、info.plist


2、


(Launching an app into the foreground)加载应用程序到前台


(Launching an app into the background)加载应用程序到后台




参考:苹果官方文档



2 0
原创粉丝点击