转载请标明出处:
http://blog.csdn.net/xmxkf/article/details/51351188
本文出自:【openXu的博客】

文章目录

  • iOS程序启动流程
    • **1. 完整启动流程**
    • **2. UIApplicationMain方法**
    • **3. UIApplication**
    • **4. AppDelegate代理(生命周期回调)**
    • **5. UIWindow**
    • **6. UIViewController控制器**
    • **7. 控制器View的加载**
  • iOS工程常见文件
    • **1. xxx-Info.plist文件**
    • **2. InfoPlist.strings**
    • **3. xxx-Prefix.pch**
    • **4. Default.png**
    • **5. Icon.png**

iOS程序启动流程

1. 完整启动流程

  • 点击程序图标
  • 执行main函数
  • 执行UIApplicationMain函数
  • 创建UIApplication对象、UIApplication的delegate对象
  • 开启事件循环监听系统
  • 程序加载完毕后调用delegate对象的application:didFinishLaunchingWithOptions:方法
    • 创建窗口对象
      self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    • 创建控制器对象
      self.viewController = [[MJViewController alloc] initWithNibName:@"MJViewController" bundle:nil];
    • 设置窗口的根控制器
      self.window.rootViewController = self.viewController;
    • 让窗口成为主窗口、并且可见
      [self.window makeKeyAndVisible];

2. UIApplicationMain方法

  在main.m的main函数中执行了UIApplicationMain这个方法,这是ios程序的入口点

int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName)
  • argc、argv:ISO C标准main函数的参数,直接传递给UIApplicationMain进行相关处理即可;

  • principalClassName:指定应用程序类,该类必须是UIApplication(或子类)。

  • delegateClassName:指定应用程序类的代理类,该类必须遵守UIApplicationDelegate协议;

    此函数会根据principalClassName创建UIApplication对象,根据delegateClassName创建一个delegate对象,并将该delegate对象赋值给UIApplication对象中的delegate属性;UIApplication对象会依次给delegate对象发送不同的消息,接着会建立应用程序的main runloop(事件循环),进行事件的处理(首先会调用delegate对象的 application:didFinishLaunchingWithOptions:),程序正常退出时这个函数才返回。如果进程要被系统强制杀死,一般这个函数还没来得及返回进程就终止了。

3. UIApplication

  • UIApplication是应用程序的核心,每一个程序在运行期必须有UIApplication(或子类)的一个实例(有且仅有一个),通过[UIApplication sharedApplication]可以得到这个单例实例的指针。
  • UIApplication帮助管理应用程序的生命周期,而它通过delegate来履行这个任务。
  • UIApplication可以接收事件,把所有用户事件都放入队列,逐个处理,它会发送当前事件给一个合适的目标控件进行处理。它还将部分事件转给delegate对象来处理,delegate可处理的事件包括:应用程序的生命周期事件(如程序启动和关闭)、系统事件(如来电)
- (IBAction)click {UIApplication *app =  [UIApplication sharedApplication];//影藏显示状态栏app.statusBarHidden = No;// 设置图标右上角的数字app.applicationIconBadgeNumber = 0;// 设置是否需要显示网络连接状态app.networkActivityIndicatorVisible = YES;// 打电话\发短信\发邮件\打开safari浏览器NSURL *url = [NSURL URLWithString:@"tel://10086"];NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];[app openURL:url];
}

4. AppDelegate代理(生命周期回调)

  UIApplicationMain方法根据第四个参数delegateClassName生成应用程序类的代理_(该类必须遵守UIApplicationDelegate协议)_,然后设置给UIApplication。应用程序生命周期发生变化就会调用AppDelegate代理中的方法。

@implementation MJAppDelegate#pragma mark 在应用程序启动完毕后调用(只会调用一次,第一次打开程序的时候才会调用)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{}#pragma mark 在app进入前台的时候调用
- (void)applicationWillEnterForeground:(UIApplication *)application{}
#pragma mark 当app获得焦点的时候调用(已激活)
- (void)applicationDidBecomeActive:(UIApplication *)application{}#pragma mark 当app失去焦点的时候调用(未激活)
- (void)applicationWillResignActive:(UIApplication *)application{}
#pragma mark 在app进入后台的时候调用
- (void)applicationDidEnterBackground:(UIApplication *)application{}#pragma mark 当app被关闭的时候会调用(前提条件:app在后台运行的时候)
- (void)applicationWillTerminate:(UIApplication *)application{}
@end

5. UIWindow

  UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow,但可以手动创建多个UIWindow。

UIWindow的主要作用:
①、提供一个区域来显示视图
②、将事件分发给视图
③、与UIViewController协同工作,方便完成设备方向旋转的支持

添加UIView到UIWindow中两种常见方式:
①、addSubview:直接将UIView添加到UIWindow中,程序负责维护UIView的生命周期以及刷新,但并不会理会UIView对应的UIViewController
②、rootViewController:自动将UIViewController对应的UIView添加到UIWindow中,同时负责维护UIViewController和UIView的生命周期

常用方法
makeKeyWindow:让当前UIWindow变成keyWindow
makeKeyAndVisible:让当前UIWindow变成keyWindow,并显示出来

6. UIViewController控制器

  UIViewController属于MVC模型中的C(Controller),说的更具体点它是一个视图控制器,管理着一个视图(UIView)。
  一个UIViewController应该只管理一个view hierarchy,通常来说一个完整的view hierarchy指的是占满整一个屏幕。而很多app满屏中会有各个区域分管不同的功能,一些开发者喜欢直接新建一个UIViewController和一套相应的view来完成所要的功能,这样做完全不符合Apple提供的设计规范。

UIViewController生命周期方法:
①、当view加载后调用viewDidLoad,这里可以进行一些数据的请求或加载,用来更新界面
②、当view将要被加入view hierarchy时调用viewWillAppear,完成加入时调用viewDidAppear
③、当view将要从view hierarchy中移除时调用viewWillDisappear,完成移除时调用viewDidDisappear
④、当内存紧张时, 调用didReceiveMemoryWarning,其默认实现是如果当前UIViewController的view的superview是nil,则将view释放且调用viewDidUnload, viewDidUnload中你可以进行后继的内存清理工作(主要是界面元素的释放,当再次加载的时候需要重建)
(这里的view是指UIViewController内部的view属性)

7. 控制器View的加载

  应用程序启动后,会调用代理的application:didFinishLaunchingWithOptions:方法,在这个方法中会完成控制器和View的加载。
  控制器MJViewController的view是延迟加载的,用到view时,就会调用控制器的loadView方法加载view,loadView加载view的默认过程(UIViewController的默认实现):

1> 如果nibName有值,就会加载对应的xib文件来创建view
2> 如果nibName没有值1) 优先加载MJView.xib文件来创建view2) 加载MJViewController.xib文件来创建view3) 如果没有找到上面所述的xib文件,就会用代码创建一个黑色的view
@implementation MJAppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];// 创建控制器(控制器的view是延时加载:用到时再加载)self.viewController = [[MJViewController alloc] initWithNibName:@"MJViewController" bundle:nil];// 如果执行下面设置view背景的方法,就会调用loadView加载view//self.viewController.view.backgroundColor = [UIColor blueColor];// 设置根控制器(没有用到根控制器的view)self.window.rootViewController = self.viewController;// 设置窗口可见(此时会加载view)[self.window makeKeyAndVisible];return YES;
}
@implementation MJViewController
#pragma mark 如果不重写loadView,UIViewController默认实现
- (void)loadView{// 不应该调用super的loadView// [super loadView];//NSLog(@"---loadView");// 死循环//self.view = [[UIScrollView alloc] initWithFrame:self.view.frame];// 返回最适合控制器view的frameCGRect frame = [UIScreen mainScreen].applicationFrame;//NSLog(@"%@", NSStringFromCGRect(frame));self.view = [[UIScrollView alloc] initWithFrame:frame];self.view.backgroundColor = [UIColor yellowColor];
}*/#pragma mark view 加载完毕后调用
- (void)viewDidLoad{[super viewDidLoad];// 初始化子控件
}
@end

iOS工程常见文件

1. xxx-Info.plist文件

  项目中最主要的文件,描述了软件名称、软件版本、唯一标识等,修改Summery相当于修改此文件。相当于Android的清单文件AndroidManifest.xml

  Bundle version -版本号(每次往App Store上发布一个新版本时,需要增加这个版本号)
  Bundle display name - 软件名称(限制在10-12个字符,如果超出,将被显示缩写名称)
  Localiztion native development region-本地化相关
  Icon file-app图标名称,一般为Icon.png
  Main nib file base name-主nib文件的名称
  Bundle identifier-项目的唯一标识,部署到真机时用到
  …

注意: 在Xcode3的时候文件名叫做:Info.plist,所以我们在创建.plist文件时不要取名为Info或者info.plist

2. InfoPlist.strings

  国际化相关配置

3. xxx-Prefix.pch

  一般来说,可以将项目中经常用到的一些头文件放在这里来import,整个项目都可以访问这个文件的内容,这样既节省了手动添加import的时间,也有助于加速编译。在这里定义的宏,整个项目都可以访问。
  示例:在pch文件中添加下列预处理指令,然后在项目中使用Log(…)来输出日志信息,就可以在发布应用的时候,一次性将NSLog语句移除(在调试模式下,才有定义DEBUG)

/*如果软件处于调试状态,系统会默认定义一个叫做DEBUG的宏;如果软件处于发布打包状态,系统就不会定义DEBUG这个宏*/
#ifdef DEBUG
// 调试状态:将MJLog替换成NSLog
#define MJLog(...)  NSLog(__VA_ARGS__)
#else
// 发布状态:将MJLog替换成空
#define MJLog(...)
#endif

4. Default.png

  应用程序在启动过程中会全屏显示叫做Default.png的图片,不同屏幕分辨率会加载不同的图片,如果没找到会使用最接近的那张(系统自动识别)
Default.png 320x480
Default@2x.png 640x960
Default-568h@2x.png 640x1136

5. Icon.png

  应用程序图标
  苹果官方文档搜索"app icon" -->App Icons on iPad and iphone
  

iOS应用程序工程文件以及启动流程相关推荐

  1. 《Cortex-M0权威指南》之体系结构---程序映像和启动流程

    <Cortex-M0权威指南>之体系结构---程序映像和启动流程 转载请注明来源:cuixiaolei的技术博客 我们先来看看程序映像. 通常,Cortex-M0处理器的程序映像时从地址0 ...

  2. 创建工程文件(完整流程)

    创建并完成一个简单的工程的流程 添加文件 创建文件 此时,文件就添加完毕了 设置字体 设置Table的空格字数为4个 书写代码(拷贝的正点原子的例程) 点击综合,生成设计后的原理图 第一种方法:进行I ...

  3. JStrom 入门(三) 上传jar文件并启动流程

    2019独角兽企业重金招聘Python工程师标准>>> jstorm jar xxxxxx.jar com.alibaba.xxxx.xx parameter 转载于:https:/ ...

  4. linux 启动流程与文件系统管理

    启动流程与主要启动记录区(MBR) CMOS 与 BIOS CMOS是记录各项硬件参数且嵌入在主板上面的储存器 BIOS则是一个写入到主板上的一个韧体(再次说明, 韧体就是写入到硬件上的一个软件程序) ...

  5. 3_IMX6ULL启动流程

    第三章 IMX6ULL启动流程 3.1 IMX6ULL启动方式 3.1.1 芯片手册讲解 ​ IMX6ULL芯片内部有一个boot ROM,上电后boot ROM上的程序就会运行.它会根据BOOT_M ...

  6. openfire服务器源码阅读学习之启动流程(一)

    openfire启动流程(ServerStarter类.XMPPServer类) 首先从org.jivesoftware.openfire.starter包下的ServerStarter.java文件 ...

  7. 应用程序工程文件组织重要性

    在大型应用工程,当应用程序工程文件大了以后,业务逻辑代码和数据呈现代码不应该放到一起,否则工程文件结构非常混乱,彼此之际既无关联也无明确调用关系的时候,我们根本就没法做相应的调试. 在大型项目中,除了 ...

  8. iOS 应用程序的启动流程及其代理

    应用程序的启动步骤 main函数调用UIApplicationMain. UIApplicationMain创建了一个UIApplication UIApplicationMain创建了一个AppDe ...

  9. IOS应用程序发布到苹果APP STORE完整流程使用教程

    参考: http://blog.csdn.net/mad1989/article/details/8167529(xcode APP 打包以及提交apple审核详细流程(新版本更新提交审核)) htt ...

最新文章

  1. python turtle库画图案-Python基础图形绘制库——turtle
  2. MatLab 自编的 均值滤波、中值滤波、高斯滤波 图像处理函数
  3. c语言node程序,如何从Node.js调用C代码?
  4. python电脑推荐_6款Python必备的可视化工具推荐
  5. linux c之wait和waitpid函数的用法和总结
  6. 确定计算机配置方案的原则,确定计算机配置方案的原则
  7. 最大 / 小的K个数
  8. coreldraw做生化标志_做一次体检,会“吃”进多少辐射?
  9. UVA 10391 STL容器的使用
  10. Javascript基础知识笔记二
  11. 用NSSM把influxDB安装成windows后台服务
  12. Touch Panel 调试技巧 01
  13. 领航机器人广告段子_“满屏尽是段子手”,喜剧综艺如何从“笑声”中突围?...
  14. 为什么说每个软件工程师,都该懂大数据技术?
  15. 对HANA的认识与相关测试案例
  16. win10蓝牙功能不见了_Win10 2004更新了什么?新功能新特性汇总
  17. Qt setFocus无法生效问题
  18. 云服务AppId或AppKey和AppSecret生成策略(对外接口使用)
  19. 无间道中毒综合征(影迷朋友过来看看)
  20. STM32 ISP串口烧录 VB源码(二)关键代码

热门文章

  1. 服务器安装 OpenStack —— Newton 实践指南(零)
  2. 给Win10重新装上“磁盘碎片整理”组件,修复精简系统压缩卷功能
  3. centos7之zabbix的监控H3C ER3200G2流量
  4. matlab闪退 i7,关于matlab代码运行出错的问题,在于读取文件与如何修改。
  5. 如何找回不小心删除的PDF文档?
  6. hibernnate 使用Oracle的sequence为对象生成主键 自增50的问题
  7. 用数据科学研究GameFi
  8. 7-3 Point3D类
  9. 日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个 嫌疑犯的一个。以下为4个嫌疑犯的供词。
  10. isnumberic函数要注意的地方