iOS应用程序运行流程_第1页
iOS应用程序运行流程_第2页
iOS应用程序运行流程_第3页
iOS应用程序运行流程_第4页
iOS应用程序运行流程_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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文件中,Files Owner必须 为UIApplication(或子类),并且建立一个遵 守UIApplicationDelegate的delegate对象, 建立UIApplication和delegate对象的关联关系四大对象关系图iOS中的mvcUIApplicationUIApplication是应用程序的核心,每一个程序在运行期必须 有UIApplication(或子类)的一个实例(有且仅有一个),通 过UIApplication sharedApplication可以得到这个单例实例 的指针UIApplication帮助管理应用程序的生命周期,而它通过delegate来履行这个任务UIApplication可以接收事件,把所有用户事件都放入队列,逐个 处理,它会发送当前事件给一个合适的目标控件进行处理。它还将部分事件转给delegate对象来处理,delegate可处理的事件包括:应用程 序的生命周期事件(如程序启动和关闭)、系统事件(如来电)UIApplicationUIApplication sharedApplication.windows:在本应用中打开的UIWindow列表,这样就可以接触应用中的任何一个UIView对象UIApplication sharedApplication.keyWindow:用来接收键盘以及非触摸类的消息事件的UIWindow,而且程序中每个时刻只能有一个UIWindow是keyWindow。如果某个UIWindow内部的文本框不能输入文字,可能是 因为这个UIWindow不是keyWindow下面是这个类的一些功能:1.设置icon上的数字图标/设置主界面icon上的数字图标,在2.0中引进,缺省为0UIApplicationsharedApplication.applicationIconBadgeNumber = 4;2.设置摇动手势的时候,是否支持redo,undo操作/摇动手势,是否支持redo undo操作。/3.0以后引进,缺省YESUIApplicationsharedApplication.applicationSupportsShakeToEdit =YES;3.判断程序运行状态/判断程序运行状态,在2.0以后引入/*UIApplicationStateActive,UIApplicationStateInactive,UIApplicationStateBackground*/if(UIApplicationsharedApplication.applicationState =UIApplicationStateInactive)NSLog(程序在运行状态);4.阻止屏幕变暗进入休眠状态/阻止屏幕变暗,慎重使用,缺省为no 2.0UIApplicationsharedApplication.idleTimerDisabled =YES;(慎重使用本功能,因为非常耗电)5.显示联网状态/显示联网标记2.0UIApplicationsharedAworkActivityIndicatorVisible =YES;6.在map上显示一个地址NSString* addressText =1 Infinite Loop, Cupertino, CA 95014;/ URL encode the spacesaddressText= addressTextstringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding;NSString* urlText = NSStringstringWithFormat:/maps?q=%, addressText;UIApplicationsharedApplicationopenURL:NSURLURLWithString:urlText;7.发送电子邮件NSString *recipients =mailto:?cc=,&subject=Hello from California!;NSString *body =&body=It is raining in sunny California!;NSString *email = NSStringstringWithFormat:%, recipients, body;email = emailstringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding;UIApplicationsharedApplicationopenURL:NSURLURLWithString:email;8.打电话到一个号码/ Call Google 411UIApplicationsharedApplicationopenURL:NSURLURLWithString:tel:/8004664411;9.发送短信/ Text to Google SMSUIApplicationsharedApplicationopenURL:NSURLURLWithString:sms:/466453;10.打开一个网址/ Lanuch any iPhone developers favsiteUIApplicationsharedApplicationopenURL:NSURLURLWithString:;UIApplicationDelegate在开发过程中,UIApplication是一个非常重要的全局对象。但在实 际编程中我们并不直接和UIApplication对象打交道,而是和其代理 打交道,它的代理必须遵守UIApplicationDelegate协议,代理供了相关的生命周期方法来处理应用程序的系统事件ios设备的内存极其优先,如果为app分配了太多内存,操作系统会终 止app的运行,在UIApplication接收到这个事件后它会调用代理 的applicationDidReceiveMemoryWarning方法,代理在这个方 法内可以进行释放内存的操作以防止操作系统强制终止应用程序的运行UIApplicationDelegatios并不是多任务的操作系统,所以app很容易受到打扰。比如一个来 电可能导致app失去焦点,如果这个时候接听了电话,那么app会自动 终止运行还有很多其它类似的事件会导致app失去焦点app失去焦点前会调用代理的applicationWillResignActiveapp再次获取焦点时会调用代理的applicationDidBecomeActive在运行app时锁屏会调用代理的applicationWillResignActive当屏幕被解锁时,会调用代理的applicationDidBecomeActiveUIApplicationDelegate生命周期方法说明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框变化完成后执行UIWindowUIWindow是一种特殊的UIView,通常在一个app中只会有一 个UIWindow,但可以手动创建多个UIWindowUIWindow的主要作用:1提供一个区域来显示视2将事件分发给视3与UIViewController协同工作,方便完成设备方向旋转的支持UIWindow添加UIView到UIWindow中两种常见方式:1addSubview:直接将UIView添加到UIWindow中,程序负责维 护UIView的生命周期以及刷新,但并不会理会UIView对应 的UIViewController2rootViewController:自动将UIViewController对应的UIView添加到UIWindow中,同时负责维护UIViewController和UIView的 生命周期常用方1makeKeyWindow:让当前UIWindow变成keyWindo2makeKeyAndVisible:让当前UIWindow变成keyWindow,并显示出来UIViewControlleUIViewController属于MVC模型中的C(Controller),说的更具体 点它是一个视图控制器,管理着一个视图(UIView)一个UIViewController应该只管理一个view hierarchy,通常 来说一个完整的view hierarchy指的是占满整一个屏幕。而很多ap p满屏中会有各个区域分管不同的功能,一些开发者喜欢直接新建一 个UIViewController和一套相应的view来完成所要的功能,这样 做完全不符合Apple供的设计规范UIViewController的view可以利用xib文件来初始化view;也可以使用自定义的view,那就必须覆盖loadView方法来创建这个viewUIViewController的view是lazy loading的,当你访 问其view属性时,view会从xib文件载入或者通过代码创 建(覆盖loadView方法,自定义其view hierarchy)可以用isViewLoaded方法判断一个UIViewController的view是否已经被加载UIViewController生命周期方法的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建立一个工程后,会在Supporting files文件夹下看到一个”工程名-Info.plist”的文件,该文件对工程做一些运行期的配置,很重要, 不能删除在旧版本Xcode创建的工程中,这个配置文件的名字就叫”Info.plist”如果使用文本编辑器打开这个文件,会发现这是一个XML格式的文本文件,一般不用文本编辑器直接编辑这个文件,而是通过Xcode编辑项目中还有一个InfoPlist.strings的文件,跟Info.plist文件的 本地化相关工程名-Info.plist常见属性(红色部分是用文本编辑器打开时看到的key)Localiztion native development region(CFBundleDevelopmentRegion)-本地化相关Bundle display name(CFBundleDisplayName)-程序安装后显 示的名称,限制在10-12个字符,如果超出,将被显示缩写名称Icon file(CFBundleIconFile)-app图标名称,一般为Icon.pngBundle version(CFBundleVersion)-应用程序的版本号,每次往App Store上发布一个新版本时,需要增加这个版本号Main nib file base name(NSMainNibFile)-主nib文件的名称Bundle identifier(CFBundleIdentifier)-项目的唯一标识, 部署到真机时用到工程名-Prefix.pch一般来说,可以将项目中经常用到的一些头文件放在这里来import, 整个项目都可以访问这个文件的内容,这样既节省了手动添加import的时间,也有助于加速编译在这里定义的宏,整个项目都可以访问在pch文件中添加下列预处理指令,然后在项目中使用Log(.)来输出 日志信息,就可以在发布应用的时候,一次性将NSLog语句移除(在调 试模式下,才有定义DEBUG)#ifdef DEBr #defineLog(.) NSLog(_VA_ARGS_r#elr #defineLog(.)/*r#endrr开发iOS6的注意iOS6新特性:auto layout属性,此属性只针对iOS6及以上版本iOS6以下版本运行时可能会出现的异常信息:Terminating app due to uncaugr exceptir NSInvalidUnarchiveOperationExceptionr reason: Could not instantiate clar named NSLayoutConstrainr具体场景:Xcode 4.5选择iPhone/iPad 5.0/5.1 Simulator(模拟器)解决办法:需要关闭storyboard或xib界面文 件的Use Autolayout选项,这是因为AutoLayout特性是iOS 6新增加的,在之前的5.0/5.1 Simulator模拟器中不支持nib文件nib文件是iOS中用来表述视图的xml格式的文本文件, 现在拓展名为xib,用Interface Builder打开可以 生成图形界面式的表述某书中著名的一句话:Interface Builder把窗口、 菜单栏以及窗口上的各种控件对象都”冻结”在一个NIB文件里;程序运行时,这些对象将会”苏醒”加载Nib文件时,会将文件中的表述转化为应用程序可 以操作的真正对象,所有在Interface Builder中建 立的关联(如Files Owner和其他对象之间的关联) 都能够在运行时重新建立起来主nib文件主nib文件是指应用程序一启动就装载的nib文件,它 的Files Owner一定要是个UIApplication(或子类),并且新建一个delegate对象、建立UIApplication和delegate对象的关联主nib文件的设置方法r在Info.plist通过NSMainNibFile这个key可以设置主nib文件主nib文件的设置方法r在Summary的Main Interface中rUIViewUIView是iOS中界面元素的基础,所有的界面元素都继承它,可以说 在iPhone中你能看到的、摸到的,都是UIViewUIView的基本功r1绘图和动画(用CALayer和CAAnimation实现r2事件处理(继承了UIRsponder一个UIView可以包含和管理若干个子视图,决定着子视图的位置和大小UIView常用属性frame在父视图坐标系中的位置(CGPoint origin)和大小(CGSize size)bounds在本视图坐标系中的位置(CGPoint origin的x、y永远为0)和大 小(CGSize size)center视图的中点在父视图坐标系中的rUIView*superview父rNSArray*subviews所有的子rUIWindow *window当前视图所在的rBOOLuserInteractionEnabledYES代表接收触摸事件在父视图坐标系中,父视图的左上角为坐标原点(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值r1如果绿色视图是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递归找到第一响应者,让它把键盘给退rself findFirstResponder:self.viewresignFirstResponder; - (UIView*)findFirstResponder:(UIView*)viewfor ( UIView *childView in view.subviewsr/遍历子视rif ( childViewrespondsToSelector:selector(isFirstResponder) & childView isFirstResponder )return childView;/如果childView是第一响应r UIView *result = self findFirstResponder:childViewr if (result) return resultrreturn nil;rchenyilong. Powered byPostach.io技术博客/ChenYilong/新浪微博/luohanchenyilongFullscreenFullscreen9页注释下面是这个类的一些功能:1.设置icon上的数字图标/设置主界面icon上的数字图标,在2.0中引进,缺省为0UIApplicationsharedApplication.applicationIconBadgeNumber = 4;2.设置摇动手势的时候,是否支持redo,undo操作/摇动手势,是否支持redo undo操作。/3.0以后引进,缺省YESUIApplicationsharedApplication.applicationSupportsShakeToEdit =YES;3.判断程序运行状态/判断程序运行状态,在2.0以后引入/*UIApplicationStateActive,UIApplicationStateInactive,UIApplicationStateBackground*/if(UIApplicationsharedApplication.applicationState =UIApplicationStateInactive)NSLog(程序在运行状态);4.阻止屏幕变暗进入休眠状态/阻止屏幕变暗,慎重使用,缺省为no 2.0UIApplicationsharedApplication.idleTimerDisabled =YES;(慎重使用本功能,因为非常耗电)5.显示联网状态/显示联网标记2.0UIApplicationsharedAworkActivityIndicatorVisible =YES;6.在map上显示一个地址NSString* addressText =1 Infinite Loop, Cupertino, CA 95014;/ URL encode the spacesaddressText= addressTextstringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding;NSString* urlText = NSStringstringWithFormat:/maps?q=%, addressText;UIApplicationsharedApplicationopenURL:NSURLURLWithString:urlText;7.发送电子邮件NSString *recipients =mailto:?cc=,&subject=Hello from California!;NSString *body =&body=It is raining in sunny California!;NSString *email = NSStringstringWithFormat:%, recipients, body;email = emailstringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding;UIApplicationsharedApplicationopenURL:NSURLURLWithString:email;8.打电话到一个号码/ Call Google 411UIApplicationsharedApplicationopenURL:NSURLURLWithString:tel:/8004664411;9.发送短信/ Text to Google SMSUIApplicationsharedApplicationopenURL:NSURLURLWithString:sms:/466453;10.打开一个网址/ Lanuch any iPhone developers favsiteUIApplicationsharedApplicationopenURL:NSURLURLWithString:;11页UIApplicationDelegate生命周期方法说明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)newStatusBarOrientationduration:(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)applicationDi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论