iOS应用程序工程文件以及启动流程
转载请标明出处:
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应用程序工程文件以及启动流程相关推荐
- 《Cortex-M0权威指南》之体系结构---程序映像和启动流程
<Cortex-M0权威指南>之体系结构---程序映像和启动流程 转载请注明来源:cuixiaolei的技术博客 我们先来看看程序映像. 通常,Cortex-M0处理器的程序映像时从地址0 ...
- 创建工程文件(完整流程)
创建并完成一个简单的工程的流程 添加文件 创建文件 此时,文件就添加完毕了 设置字体 设置Table的空格字数为4个 书写代码(拷贝的正点原子的例程) 点击综合,生成设计后的原理图 第一种方法:进行I ...
- JStrom 入门(三) 上传jar文件并启动流程
2019独角兽企业重金招聘Python工程师标准>>> jstorm jar xxxxxx.jar com.alibaba.xxxx.xx parameter 转载于:https:/ ...
- linux 启动流程与文件系统管理
启动流程与主要启动记录区(MBR) CMOS 与 BIOS CMOS是记录各项硬件参数且嵌入在主板上面的储存器 BIOS则是一个写入到主板上的一个韧体(再次说明, 韧体就是写入到硬件上的一个软件程序) ...
- 3_IMX6ULL启动流程
第三章 IMX6ULL启动流程 3.1 IMX6ULL启动方式 3.1.1 芯片手册讲解 IMX6ULL芯片内部有一个boot ROM,上电后boot ROM上的程序就会运行.它会根据BOOT_M ...
- openfire服务器源码阅读学习之启动流程(一)
openfire启动流程(ServerStarter类.XMPPServer类) 首先从org.jivesoftware.openfire.starter包下的ServerStarter.java文件 ...
- 应用程序工程文件组织重要性
在大型应用工程,当应用程序工程文件大了以后,业务逻辑代码和数据呈现代码不应该放到一起,否则工程文件结构非常混乱,彼此之际既无关联也无明确调用关系的时候,我们根本就没法做相应的调试. 在大型项目中,除了 ...
- iOS 应用程序的启动流程及其代理
应用程序的启动步骤 main函数调用UIApplicationMain. UIApplicationMain创建了一个UIApplication UIApplicationMain创建了一个AppDe ...
- IOS应用程序发布到苹果APP STORE完整流程使用教程
参考: http://blog.csdn.net/mad1989/article/details/8167529(xcode APP 打包以及提交apple审核详细流程(新版本更新提交审核)) htt ...
最新文章
- python turtle库画图案-Python基础图形绘制库——turtle
- MatLab 自编的 均值滤波、中值滤波、高斯滤波 图像处理函数
- c语言node程序,如何从Node.js调用C代码?
- python电脑推荐_6款Python必备的可视化工具推荐
- linux c之wait和waitpid函数的用法和总结
- 确定计算机配置方案的原则,确定计算机配置方案的原则
- 最大 / 小的K个数
- coreldraw做生化标志_做一次体检,会“吃”进多少辐射?
- UVA 10391 STL容器的使用
- Javascript基础知识笔记二
- 用NSSM把influxDB安装成windows后台服务
- Touch Panel 调试技巧 01
- 领航机器人广告段子_“满屏尽是段子手”,喜剧综艺如何从“笑声”中突围?...
- 为什么说每个软件工程师,都该懂大数据技术?
- 对HANA的认识与相关测试案例
- win10蓝牙功能不见了_Win10 2004更新了什么?新功能新特性汇总
- Qt setFocus无法生效问题
- 云服务AppId或AppKey和AppSecret生成策略(对外接口使用)
- 无间道中毒综合征(影迷朋友过来看看)
- STM32 ISP串口烧录 VB源码(二)关键代码
热门文章
- 服务器安装 OpenStack —— Newton 实践指南(零)
- 给Win10重新装上“磁盘碎片整理”组件,修复精简系统压缩卷功能
- centos7之zabbix的监控H3C ER3200G2流量
- matlab闪退 i7,关于matlab代码运行出错的问题,在于读取文件与如何修改。
- 如何找回不小心删除的PDF文档?
- hibernnate 使用Oracle的sequence为对象生成主键 自增50的问题
- 用数据科学研究GameFi
- 7-3 Point3D类
- 日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个 嫌疑犯的一个。以下为4个嫌疑犯的供词。
- isnumberic函数要注意的地方