本系列所有开发文档翻译链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址

//转载请注明出处--本文永久链接:http://www.cnblogs.com/ChenYilong/p/3496033.html

本文对应pdf文档下载链接,猛戳— :https://www.evernote.com/shard/s227/sh/ca0d8662-92fc-4e7e-bf87-e66c7abb5d47/1efbf2274b60a4b25aff8422d05e8217

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) 
★  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:)
★ 程序正常退出时这个函数才返回。如果进程要被系统强制 杀死,一般这个函数还没来得及返回进程就终止了

//转载请注明出处--本文永久链接:http://www.cnblogs.com/ChenYilong/p/3496033.html


★ 如果设置了主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方法,代理在这个方 法内可以进行释放内存的操作以防止操作系统强制终止应用程序的运行
  

//转载请注明出处--本文永久链接:http://www.cnblogs.com/ChenYilong/p/3496033.html

  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

★ 添加UIView到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提供的设计规范
UIViewControllerview 

★ 可以利用xib文件来初始化view; 也可以使用自定义的view,那就必须覆盖loadView方法来创建这个view

★ UIViewController的view是lazy loading的,当你访 问其view属性时,view会从xib文件载入或者通过代码创 建(覆盖loadView方法,自定义其view hierarchy)

★ 可以用isViewLoaded方法判断一个UIViewController 的view是否已经被加载

//转载请注明出处--本文永久链接:http://www.cnblogs.com/ChenYilong/p/3496033.html

UIViewController生命周期方法的

★ 当view加载后调用viewDidLoad,这里可以进行一些数据的请求或加载,用来更新界面★  当view将要被加入view hierarchy时调用viewWillAppear,完成 加入时调用viewDidAppear ★  当view将要从view hierarchy中移除时调用viewWillDisappear ,完成移除时调用viewDidDisappear

★  当内存紧张时, 调用didReceiveMemoryWarning,其默认实现是如 果当前UIViewController的view的superview是nil,则将view释 放且调用viewDidUnloadviewDidUnload中你可以进行后继的内 存清理工作(主要是界面元素的释放,当再次加载的时候需要重建) (这里的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.png 
★  Bundle version(CFBundleVersion)-应用程序的版本号,每次 往App Store上发布一个新版本时,需要增加这个版本号 
★  Main nib file base name(NSMainNibFile)-主nib文件的名称 
★  Bundle identifier(CFBundleIdentifier)-项目的唯一标识, 部署到真机时用到 

工程名-Prefix.pch

★  一般来说,可以将项目中经常用到的一些头文件放在这里来import, 整个项目都可以访问这个文件的内容,这样既节省了手动添加import 的时间,也有助于加速编译 
★  在这里定义的宏,整个项目都可以访问 ★  在pch文件中添加下列预处理指令,然后在项目中使用Log(...)来输出 日志信息,就可以在发布应用的时候,一次性将NSLog语句移除(在调 试模式下,才有定义DEBUG)    #ifdef DEB
    #define Log(...) NSLog(__VA_ARGS_
    #el
    #define Log(...) /*
    #end
开发iOS6的注意 
★ iOS6新特性:auto layout属性,此属性只针对iOS6及以上版本★ iOS6以下版本运行时可能会出现的异常信息:Terminating app due to uncaug
 excepti
 ‘NSInvalidUnarchiveOperationException
 reason: ‘Could not instantiate cal
 named NSLayoutConstrain
 ★ 具体场景:Xcode 4.5 选择iPhone/iPad 5.0/5.1 Simulator(模拟器)★ 解决办法:需要关闭storyboard或xib界面文 件的Use Autolayout 选项,这是因为AutoLayout特性是iOS 6新增加的,在之前的 5.0/5.1 Simulator模拟器中不支持

//转载请注明出处--本文永久链接:http://www.cnblogs.com/ChenYilong/p/3496033.html


nib文件
★ nib文件是iOS中用来表述视图的xml格式的文本文件, 现在拓展名为xib,用Interface Builder打开可以 生成图形界面式的表述
★  某书中著名的一句话:Interface Builder把窗口、 菜单栏以及窗口上的各种控件对象都”冻结”在一个NIB 文件里;程序运行时,这些对象将会”苏醒” 
★  加载Nib文件时,会将文件中的表述转化为应用程序可 以操作的真正对象,所有在Interface Builder中建 立的关联(如File’s Owner和其他对象之间的关联) 都能够在运行时重新建立起来 
nib文件
★ 主nib文件是指应用程序一启动就装载的nib文件,它 的File’s Owner一定要是个UIApplication(或子类) ,并且新建一个delegate对象、建立UIApplication 和delegate对象的关联

主nib文件的设置方法

★ 在Info.plist通过NSMainNibFile这个key可以设置主nib文件
主nib文件的设置方法 
 在Summary的Main Interface中
 


UIView



★ UIView是iOS中界面元素的基础,所有的界面元素都继承它,可以说 在iPhone中你能看到的、摸到的,都是UIView★ UIView的基本功
  1 绘图和动画(用CALayer和CAAnimation实现
  2 事件处理(继承了UIRsponde
  ★ 一个UIView可以包含和管理若干个子视图,决定着子视图的位置和大小
UIView常用属性
★ frame
在父视图坐标系中的位置(CGPoint origin)和大小(CGSize size)
★ bounds
在本视图坐标系中的位置(CGPoint origin的x、y永远为0)和大 小(CGSize size)
★ center
  
视图的中点在父视图坐标系中的
  ★ UIView*superview
  ★ NSArray*subviews所有的子
  ★ UIWindow *window 当前视图所在的
  ★ BOOLuserInteractionEnabledYES代表接收触摸事件 • 在父视图坐标系中,父视图的左上角为坐标原点(0,
   • 在本视图坐标系中,本视图的左上角为坐标原点(0, 0)

UIKit坐标系

//转载请注明出处--本文永久链接:http://www.cnblogs.com/ChenYilong/p/3496033.html

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值

  1 如果绿色视图是View3的父视图,那么View3的x,y为红色箭头的
  2 如果View1是View3的父视图,那么View3的x,y为蓝色箭头的宽度
UIView常用方法和属性

★ -(void)removeFromSuperview

//从父视图中移除(当前视图的计数器会-1)

★ -(void)addSubview:(UIView*)view

//添加一个子视图(新添加的子视图在父视图的最上面,子视图的计数器会+1)

★ -(UIView*)viewWithTag:(NSInteger)tag 根据tag找到对应的子视图

iOS关闭键盘的方法 
★ 调用UIView的endEditing方法,例如

[self.view endEditing:YES];

成功关闭键盘的条件:self.view或者其子视图是第一响应者
关闭键盘的方法2
递归找到第一响应者,让它把键盘给退

[[self findFirstResponder:self.view] resignFirstResponder]; - (UIView*)findFirstResponder:(UIView*)view

{

for ( UIView *childView in view.subviews

{ // 遍历子视

if ( [childViewrespondsToSelector:@selector(isFirstResponder)] && [childView isFirstResponder] )

{

return childView; // 如果childView是第一响应

}        UIView *result = [self findFirstResponder:childView

if (result) return result

}return nil;

本文对应pdf文档下载链接,猛戳— :https://www.evernote.com/shard/s227/sh/0e978151-cc2f-4e36-9095-2fe0735a8700/e15a8a0022bdbbebe3e71218e488a399

//转载请注明出处--本文永久链接:http://www.cnblogs.com/ChenYilong/p/3496033.html

本系列所有开发文档翻译链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址

转载于:https://www.cnblogs.com/ChenYilong/p/3496033.html

iOS程序启动原理---iOS-Apple苹果官方文档翻译相关推荐

  1. iOS程序启动原理(上)

    为什么80%的码农都做不了架构师?>>>    iOS程序启动原理 Info.plist 常见设置 建立一个工程后,会在Supporting files文件夹下看到一个"工 ...

  2. iOS开发 - App程序启动原理

    Info.plist和pch文件的作用 建立一个project后,会在Supporting files目录下看到一个"project名-Info.plist"的文件,该文件对pro ...

  3. 【iOS程序启动与运转】- RunLoop个人小结

    作者:楚天舒 授权本站转载. 学习iOS开发一般都是从UI开始的,从只知道从IB拖控件,到知道怎么在方法里写代码,然后会显示什么样的视图,产生什么样的事件,等等.其实程序从启动开始,一直都是按照苹果封 ...

  4. iOS开发系列--IOS程序开发概览ios基础

    iOS开发系列--IOS程序开发概览 概览 终于到了真正接触IOS应用程序的时刻了,之前我们花了很多时间去讨论C语言.ObjC等知识,对于很多朋友而言开发IOS第一天就想直接看到成果,看到可以运行的I ...

  5. iOS程序启动过程笔记

    CHENYILONG Blog 笔记 一.iOS程序的完整启动过程(有storyboard) 1.先执行main函数,main内部会调用UIApplicationMain函数 2.UIApplicat ...

  6. 比较windows phone程序启动和android程序启动原理

    windows phone 程序是如何启动的了,他和android程序有什么区别,我们重点从native code 层面来分析 在windows phone 程序启动的时候是: 在XAML中使用应用程 ...

  7. UIControl事件---iOS-Apple苹果官方文档翻译

    本系列所有开发文档翻译链接地址: iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址 UIControl事件1.UIControlEventTouchDown 单点触摸按 ...

  8. UIPageControl---iOS-Apple苹果官方文档翻译

    本系列所有开发文档翻译链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址 //转载请注明出处--本文永久链接:http://www.cnblogs.com/Ch ...

  9. IAP 苹果官方文档翻译 超级详解

    原文地址: http://gaohaijun.blog.163.com/blog/static/176698271201143194018328/ 一.In App Purchase概览 Store ...

最新文章

  1. 记一次suse linux崩溃
  2. matlab检测图片马赛克,python 检测图片是否有马赛克
  3. 【Todo】Tomcat与Jetty的比较 以及Tomcat架构的学习
  4. Colors on the web
  5. caffe各层参数详解
  6. 怎样删了系统升级服务器,如何优雅的搞垮服务器,再优雅的救活
  7. PHP+Ajax点击加载更多内容 -这个效果好,速度快,只能点击更多加载,不能滚动自动加载...
  8. parsley.js自定义验证规则之大小写
  9. 【MATLAB中UIGETFILE函数的用法】
  10. 牛牛的闹钟--网易2019实习生招聘编程题
  11. 1.8安装大华相机SDK及测试
  12. CodeWarrior V5.1破解license+教程
  13. 二分查找、求上界和下界(包括内置函数lower_bound、和upper_bound的使用)
  14. PMOS与NMOS的区别
  15. 股票短线详解,股票短线的方法技巧?
  16. 全局gin对象如何在子模块中修改Logger
  17. 从“上云”到“云管理”,中国首个多云管理平台评估标准有何妙处?
  18. Oracle使用json后乱码,nodejs读取本地中文json文件出现乱码解决方法
  19. Android工程师面试准备知识点
  20. android+主流品牌手机,9月Android手机品牌及机型排行报告发布

热门文章

  1. [猿来小课]Python开发入门第三讲:Python的安装
  2. uni-app小程序云开发函数——记录
  3. 多人语言聊天以及多人视频聊天
  4. 泛微 E-cology V9 信息泄露漏洞
  5. 江苏师范大学计算机全国排名,2019中国大学排行榜江苏师范大学排名126位
  6. 新版白话空间统计(6):在ArcGIS中实现莫兰指数计算
  7. 计算区间素数和,杨老师正在上《离散数学》课程的“数论”内容,讲授素数的知识。素数又称为质数。一个大于1的整数p是素数,当且仅当p只能被1和自身整除。很显然,2是最小的素数。他想设计一个程序
  8. 【手写 Promise 源码】第八篇 - 完善 Promise 并通过 promise-aplus-tests 测试
  9. Proxmox VE(PVE)连接WiFi及一些配置
  10. bash 和 sh 的一点儿区别