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、
通常情况下,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)加载应用程序到后台
参考:苹果官方文档
- IOS的APP结构、生命周期、main
- iOS: App的生命周期
- iOS App的生命周期
- iOS App的生命周期
- iOS App的生命周期
- iOS下app的生命周期
- iOS App的整个生命周期
- 详解iOS App生命周期
- 详解iOS App生命周期
- iOS App 生命周期
- iOS App生命周期
- iOS开发-APP启动main()调用之前的加载过程
- IOS iPhone的App的目录结构
- iOS App 项目目录结构的搭建
- iOS App生命周期与视图生命周期
- 探索IOS App的生命周期之启动篇
- iOS开发之旅之App的生命周期
- iOS开发——app的五种生命周期状态
- multithreading--演示中断线程Thread的异常
- 经典SQL语句大全
- HDU 1216 Assistance Required
- VoIPER测试工具的使用
- 求两个数最大公约数
- IOS的APP结构、生命周期、main
- Linux kvm 虚拟机介绍
- SPDY 是什么?如何部署 SPDY?
- 高精度加法
- IOS开发笔记23-Foundation框架(上)
- iPhone开发 判断当前的网络是3g还是wifi
- C++primer学习:关于upper_bound和lower_bound的探究.
- android在代码中怎么设置 RadioGroup的默认值
- LeetCode 213: House Robber II