首页 > 技术文章 > iOS程序启动原理

ChenYilong 2014-02-19 17:44 原文

iOS程序启动原理



iOS程序启动原理

技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilong


 
iOS应用程序运行流程




UIApplicationMain
 main.mmain函数中执行了UIApplicationMain这个方法,这 是ios程序的入口点 
intUIApplicationMain(intargc,char*argv[], NSString *principalClassName, NSString *delegateClassName) 
 argcargv:ISO C标准main函数的参数,直接传递 给UIApplicationMain进行相关处理即可 
 principalClassName:指定应用程序类,该类必须 是UIApplication(或子类)。如果为nil,则用UIApplication类 作为默认值 
 delegateClassName:指定应用程序类的代理类,该类必须遵 守UIApplicationDelegate协议 

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


 如果设置了主xib文件(在Info.plist中指定 ,keyNSMainNibFile),就会在主xib文件中 寻找UIApplication和连接它的delegate。因 此在主xib文件中,File’s Owner必须 为UIApplication(或子类),并且建立一个遵 守UIApplicationDelegatedelegate对象, 建立UIApplicationdelegate对象的关联关系
四大对象关系图


iOS中的mvc

 

UIApplication
 UIApplication是应用程序的核心,每一个程序在运行期必须 有UIApplication(或子类)的一个实例(有且仅有一个),通 过[UIApplication sharedApplication]可以得到这个单例实例 的指针
 UIApplication帮助管理应用程序的生命周期,而它通过delegate 来履行这个任务
 UIApplication可以接收事件,把所有用户事件都放入队列,逐个 处理,它会发送当前事件给一个合适的目标控件进行处理。它还将部分 事件转给delegate对象来处理,delegate可处理的事件包括:应用程 序的生命周期事件(如程序启动和关闭)、系统事件(如来电)


UIApplication
 [UIApplication sharedApplication].windows: 在本应用中打开的UIWindow列表,这样就可以接触应用
中的任何一个UIView对象
 [UIApplication sharedApplication].keyWindow: 用来接收键盘以及非触摸类的消息事件的UIWindow,而
且程序中每个时刻只能有一个UIWindowkeyWindow 如果某个UIWindow内部的文本框不能输入文字,可能是 因为这个UIWindow不是keyWindow

下面是这个类的一些功能:
1.设置icon上的数字图标

//设置主界面icon上的数字图标,在2.0中引进, 缺省为0

[UIApplicationsharedApplication].applicationIconBadgeNumber = 4;
2.
设置摇动手势的时候,是否支持redo,undo操作

//
摇动手势,是否支持redo undo操作。

//3.0
以后引进,缺省YES

[UIApplicationsharedApplication].applicationSupportsShakeToEdit =
YES;

3.判断程序运行状态

//判断程序运行状态,在2.0以后引入

/*

UIApplicationStateActive,

UIApplicationStateInactive,

UIApplicationStateBackground

*/

if([UIApplicationsharedApplication].applicationState ==UIApplicationStateInactive){

NSLog(@"
程序在运行状态");

}
4.
阻止屏幕变暗进入休眠状态

//
阻止屏幕变暗,慎重使用,缺省为no 2.0

[UIApplicationsharedApplication].idleTimerDisabled =YES;

(慎重使用本功能,因为非常耗电)
5.
显示联网状态

//
显示联网标记 2.0
[UIApplicationsharedApplication].networkActivityIndicatorVisible =YES;


6.map上显示一个地址

NSString* addressText =
@"1 Infinite Loop, Cupertino, CA 95014";

// URL encode the spaces

addressText= [addressTextstringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];

NSString* urlText = [NSStringstringWithFormat:@"
http://maps.google.com/maps?q=%@", addressText];

[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:urlText]];


7.发送电子邮件

NSString *recipients =
@"mailto:first@example.com?cc=second@example.com,third@example.com&subject=Hello from California!";

NSString *body =
@"&body=It is raining in sunny California!";

NSString *email = [NSStringstringWithFormat:
@"%@%@", recipients, body];

email = [emailstringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:email]];
8.打电话到一个号码

// Call Google 411
[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"tel://8004664411"]];


9.发送短信

// Text to Google SMS
[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"sms://466453"]];


10.打开一个网址

// Lanuch any iPhone developers favsite
[[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"http://itunesconnect.apple.com"]];






UIApplicationDelegate
 在开发过程中,UIApplication是一个非常重要的全局对象。但在实 际编程中我们并不直接和UIApplication对象打交道,而是和其代理 打交道,它的代理必须遵守UIApplicationDelegate协议,代理

推荐阅读