iOS程序启动原理
iOS程序启动原理
iOS程序启动原理
技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilong
iOS应用程序运行流程
UIApplicationMain
★ 在main.m的main函数中执行了UIApplicationMain这个方法,这 是ios程序的入口点
★intUIApplicationMain(intargc,char*argv[], NSString *principalClassName, NSString *delegateClassName)
★ argc、argv: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中指定 ,key是NSMainNibFile),就会在主xib文件中 寻找UIApplication和连接它的delegate。因 此在主xib文件中,File’s Owner必须 为UIApplication(或子类),并且建立一个遵 守UIApplicationDelegate的delegate对象, 建立UIApplication和delegate对象的关联关系
四大对象关系图
iOS中的mvc
UIApplication
★ UIApplication是应用程序的核心,每一个程序在运行期必须 有UIApplication(或子类)的一个实例(有且仅有一个),通 过[UIApplication sharedApplication]可以得到这个单例实例 的指针
★ UIApplication帮助管理应用程序的生命周期,而它通过delegate 来履行这个任务
★ UIApplication可以接收事件,把所有用户事件都放入队列,逐个 处理,它会发送当前事件给一个合适的目标控件进行处理。它还将部分 事件转给delegate对象来处理,delegate可处理的事件包括:应用程 序的生命周期事件(如程序启动和关闭)、系统事件(如来电)
UIApplication
★ [UIApplication sharedApplication].windows: 在本应用中打开的UIWindow列表,这样就可以接触应用
中的任何一个UIView对象
★ [UIApplication sharedApplication].keyWindow: 用来接收键盘以及非触摸类的消息事件的UIWindow,而
且程序中每个时刻只能有一个UIWindow是keyWindow。 如果某个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协议,代理 供了相关的生命周期方法来处理应用程序的系统事件
> ★ ios设备的内存极其优先,如果为app分配了太多内存,操作系统会终 止app的运行,在UIApplication接收到这个事件后它会调用代理 的applicationDidReceiveMemoryWarning方法,代理在这个方 法内可以进行释放内存的操作以防止操作系统强制终止应用程序的运行
>
> UIApplicationDelegat
> ★ ios并不是多任务的操作系统,所以app很容易受到打扰。比如一个来 电可能导致app失去焦点,如果这个时候接听了电话,那么app会自动 终止运行
> ★ 还有很多其它类似的事件会导致app失去焦点
> ★ app失去焦点前会调用代理的applicationWillResignActive
> ★ app再次获取焦点时会调用代理的applicationDidBecomeActive
> ★ 在运行app时锁屏会调用代理的applicationWillResignActive
> ★ 当屏幕被解锁时,会调用代理的applicationDidBecomeActive
> UIApplicationDelegate生命周期方法说明
> 1、- (void)applicationWillResignActive:(UIApplication *)application{
> / /从主动到非活动状态的应用程序时发送。这可导致产生某些类型的临时中断(如传入电话呼叫或SMS消息) ,或者当用户退出应用程序,它开始过渡到的背景状态。
> / /使用此方法暂停正在进行的任务,禁用定时器,踩下油门,OpenGL ES的帧速率。游戏应该使用这种方法来暂停游戏。
> }
> 2、- (void)applicationDidBecomeActive:(UIApplication *)applicatio
> 说明:当应用程序入活动状态执行,这个刚好跟上面那个方法相反
> 3、- (void)applicationDidEnterBackground:(UIApplication *)application{
> 说明:当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可
> / /使用这个方法来释放共享资源,保存用户数据,废止定时器,并存储足够的应用程序状态信息的情况下被终止后,将应用程序恢复到目前的状态。
> / /如果你的应用程序支持后台运行,这种方法被调用,而不是applicationWillTerminate :当用户退出。
> }
> 4、- (void)applicationWillEnterForeground:(UIApplication *)applicatio
> 说明:当程序从后台将要重新回到前台时候调用,这个刚好跟上面的那个方法相反。
> 5、- (void)applicationWillTerminate:(UIApplication *)applicatio
> //不支持多任务的时候调用
>
> 说明:当程序将要退出是被调用,通常是用来保存数据和一些退出前的清理工作。这个需要要设置UIApplicationExitsOnSuspend的键值(自动设置)。
> 6、- (void)applicationDidReceiveMemoryWarning:(UIApplication *)applicatio
> 说明:iPhone设备只有有限的内存,如果为应用程序分配了太多内存操作系统会终止应用程序的运行,在终止前会执行这个方法,通常可以在这里进行内存清理工作防止程序被终止
> 7、- (void)applicationSignificantTimeChange:(UIApplication*)applicatio
> 说明:当系统时间发生改变时执行
> 8、- (void)applicationDidFinishLaunching:(UIApplication*)applicatio
> 说明:当程序载入后执行
> 9、- (void)application:(UIApplication)application willChangeStatusBarFrame:(CGRect)newStatusBarFram
> 说明:当StatusBar框将要变化时执行
> 10、- (void)application:(UIApplication*)application willChangeStatusBarOrientation
> (UIInterfaceOrientation)newStatusBarOrientatio
> duration:(NSTimeInterval)duratio
> 说明:当StatusBar框方向将要变化时执行
> 11、- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)ur
> 说明:当通过url执行
> 12、- (void)application:(UIApplication*)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientatio
> 说明:当StatusBar框方向变化完成后执行
> 13、- (void)application:(UIApplication*)application didChangeSetStatusBarFrame:(CGRect)oldStatusBarFram
> 说明:当StatusBar框变化完成后执行
>
> UIWindow
> ★ UIWindow是一种特殊的UIView,通常在一个app中只会有一 个UIWindow,但可以手动创建多个UIWindow
> ★ UIWindow的主要作用:
> 1 提供一个区域来显示视
> 2 将事件分发给视
> 3 与UIViewController协同工作,方便完成设备方向旋转的支持
>
> UIWindow
>
> 1 addSubview:直接将UIView添加到UIWindow中,程序负责维 护UIView的生命周期以及刷新,但并不会理会UIView对应 的UIViewController
> 2 rootViewController:自动将UIViewController对应的UIView 添加到UIWindow中,同时负责维护UIViewController和UIView的 生命周期
> ★ 常用方
> 1 makeKeyWindow:让当前UIWindow变成keyWindo
> 2 makeKeyAndVisible:让当前UIWindow变成keyWindow,并显示出来
>
> UIViewControlle
> ★ UIViewController属于MVC模型中的C(Controller),说的更具体 点它是一个视图控制器,管理着一个视图(UIView)
> ★ 一个UIViewController应该只管理一个view hierarchy,通常 来说一个完整的view hierarchy指的是占满整一个屏幕。而很多ap p满屏中会有各个区域分管不同的功能,一些开发者喜欢直接新建一 个UIViewController和一套相应的view来完成所要的功能,这样 做完全不符合Apple供的设计规范UIViewController的view
r> ★ 当view加载后调用viewDidLoad,这里可以进行一些数据的请求或加载,用来更新界面★当view将要被加入view hierarchy时调用viewWillAppear,完成 加入时调用viewDidAppear ★当view将要从view hierarchy中移除时调用viewWillDisappear ,完成移除时调用viewDidDisappear ★ 当内存紧张时, 调用didReceiveMemoryWarning,其默认实现是如 果当前UIViewController的view的superview是nil,则将view释 放且调用viewDidUnload, viewDidUnload中你可以进行后继的内 存清理工作(主要是界面元素的释放,当再次加载的时候需要重建) (这里的view是指UIViewController内部的view属性) 工程名-Info.plist
r> #define Log(...) NSLog(__VA_ARGS_
r> #el
r> #define Log(...) /*
r> #end
r> r>
r> excepti
r> ‘NSInvalidUnarchiveOperationException
r> reason: ‘Could not instantiate cla
r> named NSLayoutConstrain
r> ★ 具体场景:Xcode 4.5 选择iPhone/iPad 5.0/5.1 Simulator(模拟器)★ 解决办法:需要关闭storyboard或xib界面文 件的Use Autolayout 选项,这是因为AutoLayout特性是iOS 6新增加的,在之前的 5.0/5.1 Simulator模拟器中不支持nib文件
r> 在Summary的Main Interface中
r> UIView★ UIView是iOS中界面元素的基础,所有的界面元素都继承它,可以说 在iPhone中你能看到的、摸到的,都是UIView★ UIView的基本功
r> 1 绘图和动画(用CALayer和CAAnimation实现
r> 2 事件处理(继承了UIRsponde
r> ★ 一个UIView可以包含和管理若干个子视图,决定着子视图的位置和大小UIView常用属性
视图的中点在父视图坐标系中的
r> ★ UIView*superview父
r> ★ NSArray*subviews所有的子
r> ★ UIWindow *window 当前视图所在的
r> ★ BOOLuserInteractionEnabledYES代表接收触摸事件 • 在父视图坐标系中,父视图的左上角为坐标原点(0,
r> • 在本视图坐标系中,本视图的左上角为坐标原点(0, 0)UIKit坐标系
r> (0,0)View1是View2的父视图 View2.frame = {x=70,y=50,width=60,height=40} View2.bounds = {x=0,y=0,width=60,height=40} View2.center = (x=100, y=70)• UIKit框架中的坐标系都如左图所示,视图的 左上角为原点(0,0),x轴向右正向延伸,y 轴向下正向延伸• View3中frame的x,y值
r> 1 如果绿色视图是View3的父视图,那么View3的x,y为红色箭头的
r> 2 如果View1是View3的父视图,那么View3的x,y为蓝色箭头的宽度UIView常用方法和属性★ -(void)removeFromSuperview从父视图中移除(当前视图的计数器会-1)★ -(void)addSubview:(UIView*)view添加一个子视图(新添加的子视图在父视图的最上面,子视图的 计数器会+1)★ -(UIView*)viewWithTag:(NSInteger)tag 根据tag找到对应的子视图iOS关闭键盘的方法r> ★ 调用UIView的endEditing方法,例如[self.viewendEditing:YES]; 成功关闭键盘的条件:self.view或者其子视图是第一响应者iOS关闭键盘的方法2
r> [[self findFirstResponder:self.view]resignFirstResponder]; - (UIView*)findFirstResponder:(UIView*)view {for ( UIView *childView in view.subviews
r> { // 遍历子视
r> if ( [childViewrespondsToSelector:@selector(isFirstResponder)] && [childView isFirstResponder] ) {return childView; // 如果childView是第一响应
r> } UIView *result = [self findFirstResponder:childView
r> if (result) return result
r> }return nil;r>
© chenyilong. Powered by Postach.io
下面是这个类的一些功能:
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
1、- (void)applicationWillResignActive:(UIApplication *)application{
/ /从主动到非活动状态的应用程序时发送。这可导致产生某些类型的临时中断(如传入电话呼叫或SMS消息) ,或者当用户退出应用程序,它开始过渡到的背景状态。
/ /使用此方法暂停正在进行的任务,禁用定时器,踩下油门, OpenGL ES的帧速率。游戏应该使用这种方法来暂停游戏。
}
2、- (void)applicationDidBecomeActive:(UIApplication *)application
说明:当应用程序入活动状态执行,这个刚好跟上面那个方法相反
3、- (void)applicationDidEnterBackground:(UIApplication *)application{
说明:当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可
/ /使用这个方法来释放共享资源,保存用户数据,废止定时器,并存储足够的应用程序状态信息的情况下被终止后,将应用程序恢复到目前的状态。
/ /如果你的应用程序支持后台运行,这种方法被调用,而不是applicationWillTerminate :当用户退出。
}
4、- (void)applicationWillEnterForeground:(UIApplication *)application
说明:当程序从后台将要重新回到前台时候调用,这个刚好跟上面的那个方法相反。
5、- (void)applicationWillTerminate:(UIApplication *)application
//不支持多任务的时候调用
说明:当程序将要退出是被调用,通常是用来保存数据和一些退出前的清理工作。这个需要要设置UIApplicationExitsOnSuspend的键值(自动设置)。
6、- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
说明:iPhone设备只有有限的内存,如果为应用程序分配了太多内存操作系统会终止应用程序的运行,在终止前会执行这个方法,通常可以在这里进行内存清理工作防止程序被终止
7、- (void)applicationSignificantTimeChange:(UIApplication*)application
说明:当系统时间发生改变时执行
8、- (void)applicationDidFinishLaunching:(UIApplication*)application
说明:当程序载入后执行
9、- (void)application:(UIApplication)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame
说明:当StatusBar框将要变化时执行
10、- (void)application:(UIApplication*)application willChangeStatusBarOrientation:
(UIInterfaceOrientation)newStatusBarOrientation
duration:(NSTimeInterval)duration
说明:当StatusBar框方向将要变化时执行
11、- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url
说明:当通过url执行
12、- (void)application:(UIApplication*)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation
说明:当StatusBar框方向变化完成后执行
13、- (void)application:(UIApplication*)application didChangeSetStatusBarFrame:(CGRect)oldStatusBarFrame
说明:当StatusBar框变化完成后执行
UIApplicationDelegate生命周期方法说明
1、- (void)applicationWillResignActive:(UIApplication *)application{
/ /从主动到非活动状态的应用程序时发送。这可导致产生某些类型的临时中断(如传入电话呼叫或SMS消息) ,或者当用户退出应用程序,它开始过渡到的背景状态。
/ /使用此方法暂停正在进行的任务,禁用定时器,踩下油门,OpenGL ES的帧速率。游戏应该使用这种方法来暂停游戏。
}
2、- (void)applicationDidBecomeActive:(UIApplication *)applicatio
说明:当应用程序入活动状态执行,这个刚好跟上面那个方法相反
3、- (void)applicationDidEnterBackground:(UIApplication *)application{
说明:当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可
/ /使用这个方法来释放共享资源,保存用户数据,废止定时器,并存储足够的应用程序状态信息的情况下被终止后,将应用程序恢复到目前的状态。
/ /如果你的应用程序支持后台运行,这种方法被调用,而不是applicationWillTerminate :当用户退出。
}
4、- (void)applicationWillEnterForeground:(UIApplication *)applicatio
说明:当程序从后台将要重新回到前台时候调用,这个刚好跟上面的那个方法相反。
5、- (void)applicationWillTerminate:(UIApplication *)applicatio
//不支持多任务的时候调用
说明:当程序将要退出是被调用,通常是用来保存数据和一些退出前的清理工作。这个需要要设置UIApplicationExitsOnSuspend的键值(自动设置)。
6、- (void)applicationDidReceiveMemoryWarning:(UIApplication *)applicatio
说明:iPhone设备只有有限的内存,如果为应用程序分配了太多内存操作系统会终止应用程序的运行,在终止前会执行这个方法,通常可以在这里进行内存清理工作防止程序被终止
7、- (void)applicationSignificantTimeChange:(UIApplication*)applicatio
说明:当系统时间发生改变时执行
8、- (void)applicationDidFinishLaunching:(UIApplication*)applicatio
说明:当程序载入后执行
9、- (void)application:(UIApplication)application willChangeStatusBarFrame:(CGRect)newStatusBarFram
说明:当StatusBar框将要变化时执行
10、- (void)application:(UIApplication*)application willChangeStatusBarOrientation
(UIInterfaceOrientation)newStatusBarOrientatio
duration:(NSTimeInterval)duratio
说明:当StatusBar框方向将要变化时执行
11、- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)ur
说明:当通过url执行
12、- (void)application:(UIApplication*)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientatio
说明:当StatusBar框方向变化完成后执行
13、- (void)application:(UIApplication*)application didChangeSetStatusBarFrame:(CGRect)oldStatusBarFram
说明:当StatusBar框变化完成后执行
作者:
出处:http://www.cnblogs.com/ChenYilong/(点击RSS订阅)
本文版权归作者和博客园共有,欢迎转载,
但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。