一、UIApplicationMain

在main.m的main函数中执行了UIApplicationMain这个方法,这是ios程序的入口点

int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName)

argc、argv:ISO C标准main函数的参数,直接传递给UIApplicationMain进行相关处理即可

principalClassName:指定应用程序类,该类必须是UIApplication(或子类)。如果为nil,则用UIApplication类作为默认值

delegateClassName:指定应用程序类的代理类,该类必须遵守UIApplicationDelegate协议

此函数会根据principalClassName创建UIApplication对象,根据delegateClassName创建一个delegate对象,并将该delegate对象赋值给UIApplication对象中的delegate属性

UIApplication对象会依次给delegate对象发送不同的消息,接着会建立应用程序的main runloop(事件循环),进行事件的处理(首先会调用delegate对象的 application:didFinishLaunchingWithOptions:)

程序正常退出时这个函数才返回。如果进程要被系统强制杀死,一般这个函数还没来得及返回进程就终止了

二、UIApplication

UIApplication是应用程序的核心,每一个程序在运行期必须有UIApplication(或子类)的一个实例(有且仅有一个),通过[UIApplication sharedApplication]可以得到这个单例实例的指针

UIApplication帮助管理应用程序的生命周期,而它通过delegate来履行这个任务

UIApplication可以接收事件,把所有用户事件都放入队列,逐个处理,它会发送当前事件给一个合适的目标控件进行处理。它还将部分事件转给delegate对象来处理,delegate可处理的事件包括:应用程序的生命周期事件(如程序启动和关闭)、系统事件(如来电)

[UIApplication sharedApplication].windows: 在本应用中打开的UIWindow列表,这样就可以接触应用中的任何一个UIView对象

[UIApplication sharedApplication].keyWindow: 用来接收键盘以及非触摸类的消息事件的UIWindow,而且程序中每个时刻只能有一个UIWindow是keyWindow。如果某个UIWindow内部的文本框不能输入文字,可能是因为这个UIWindow不是keyWindow

三、UIApplicationDelegate

在开发过程中,UIApplication是一个非常重要的全局对象。但在实际编程中我们并不直接和UIApplication对象打交道,而是和其代理打交道,它的代理必须遵守UIApplicationDelegate协议,代理提供了相关的生命周期方法来处理应用程序的系统事件

ios设备的内存极其优先,如果为app分配了太多内存,操作系统会终止app的运行,在UIApplication接收到这个事件后它会调用代理的applicationDidReceiveMemoryWarning方法,代理在这个方法内可以进行释放内存的操作以防止操作系统强制终止应用程序的运行

ios并不是多任务的操作系统,所以app很容易受到打扰。比如一个来电可能导致app失去焦点,如果这个时候接听了电话,那么app会自动终止运行

还有很多其它类似的事件会导致app失去焦点

app失去焦点前会调用代理的applicationWillResignActive

app再次获取焦点时会调用代理的applicationDidBecomeActive

在运行app时锁屏会调用代理的applicationWillResignActive

当屏幕被解锁时,会调用代理的applicationDidBecomeActive

四、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,并显示出来

五、UIViewController

UIViewController属于MVC模型中的C(Controller),说的更具体点它是一个视图控制器,管理着一个视图(UIView)

一个UIViewController应该只管理一个view hierarchy,通常来说一个完整的view hierarchy指的是占满整一个屏幕。而很多app满屏中会有各个区域分管不同的功能,一些开发者喜欢直接新建一个UIViewController和一套相应的view来完成所要的功能,这样做完全不符合Apple提供的设计规范

六、UIViewController的view

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

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

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

七、UIViewController生命周期方法的调用

当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文件的本地化相关

常见属性(红色部分是用文本编辑器打开时看到的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 DEBUG

#define Log(...) NSLog(__VA_ARGS__)

#else

#define Log(...) /* */

#endif

十、开发iOS6的注意

iOS6新特性:auto layout属性,此属性只针对iOS6及以上版本

iOS6以下版本运行时可能会出现的异常信息:

Terminating app due to uncaught exception ‘NSInvalidUnarchiveOperationException’, reason: ‘Could not instantiate class named NSLayoutConstraint’

具体场景:Xcode 4.5 选择iPhone/iPad 5.0/5.1 Simulator(模拟器)

解决办法:需要关闭storyboard或xib界面文件的Use Autolayout 选项,这是因为Auto Layout特性是iOS 6新增加的,在之前的 5.0/5.1 Simulator模拟器中不支持

十一、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对象的关联

十三、UIView

UIView是iOS中界面元素的基础,所有的界面元素都继承它,可以说在iPhone中你能看到的、摸到的,都是UIView

UIView的基本功能:

绘图和动画(用CALayer和CAAnimation实现)

事件处理(继承了UIRsponder)

一个UIView可以包含和管理若干个子视图,决定着子视图的位置和大小

十四、UIView常用方法和属性

frame

在父视图坐标系中的位置(CGPoint origin)和大小(CGSize size)

bounds

在本视图坐标系中的位置(CGPoint origin的x、y永远为0)和大小(CGSize size)

center

视图的中点在父视图坐标系中的位置

UIView *superview 父视图

NSArray *subviews 所有的子视图

UIWindow *window  当前视图所在的窗口

BOOL userInteractionEnabled YES代表接收触摸事件

- (void)removeFromSuperview

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

- (void)addSubview:(UIView *)view

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

- (UIView *)viewWithTag:(NSInteger)tag

根据tag找到对应的子视图

十五、UIKit坐标系

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值:

如果绿色视图是View3的父视图,那么View3的x,y为红色箭头的长度

如果View1是View3的父视图,那么View3的x,y为蓝色箭头的宽度

十六、iOS关闭键盘

方法1

调用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 ( [childView respondsToSelector:@selector(isFirstResponder)]

&& [childView isFirstResponder] ) {

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

}

UIView *result = [self findFirstResponder:childView];

if (result)  return result;

}

return nil;

}

iOS基础 - iOS程序启动原理的更多相关文章

  1. 详解 IOS 7.1 程序启动原理

    程序都是从Main方法入口的 IOS 也不例外 int main(int argc,char * argv[]) { @autoreleasepool { return UIApplicationMa ...

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

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

  3. iOS app 程序启动原理

    iOS app 程序启动原理 Info.plist: 常见设置     建立一个工程后,会在Supporting files文件夹下看到一个"工程名-Info.plist"的文件, ...

  4. iOS程序启动原理---iOS-Apple苹果官方文档翻译

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

  5. iOS APP程序启动原理

    UIApplication 程序启动原理 一个应用程序运行就必须要有一个进程,一个进程至少要有一个线程,我们把这个线程叫做主线程,主线程开启之后会开启一个主运行循环,如果不开启一个运行循环,程序开启了 ...

  6. iOS中的应用启动原理

    iOS中的应用启动原理 来源: http://m.blog.csdn.net/article/details?id=50530090 http://m.warting.com/program/2016 ...

  7. iOS开发——UI进阶篇(七)程序启动原理、打电话、发短信

    一.Info.plist常见的设置 1.建立一个工程后,会在Supporting files文件夹下看到一个“工程名-Info.plist”的文件,该文件对工程做一些运行期的配置,非常重要,不能删除 ...

  8. IOS程序启动原理

    1.Info.plist 建立一个工程后,会在Supporting files文件夹下看到一个“工程名-Info.plist”的文件,该文件对工程做一些运行期的配置,非常重要,不能删除 常见属性(红色 ...

  9. iOS 程序启动原理

    很多工作一段时间的iOS程序员,总是每天沉浸在代码里,大家总是按照xcode的规定生成项目,然后就开始码代码了,但是大家知道app背后的启动过程吗?当点击程序图标启动程序开始到退出,程序在运行过程中到 ...

随机推荐

  1. projecteuler---->problem=34----Digit factorials

    Problem 34 145 is a curious number, as 1! + 4! + 5! = 1 + 24 + 120 = 145. Find the sum of all number ...

  2. hdu 1712 (分组背包入门)

    http://acm.hdu.edu.cn/showproblem.php?pid=1712 问题 有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].这些物品被划分为若干组, ...

  3. 2077 汉诺塔IV

    Problem Description 还记得汉诺塔III吗?他的规则是这样的:不允许直接从最左(右)边移到最右(左)边(每次移动一定是移到中间杆或从中间移出),也不允许大盘放到小盘的上面.xhd在想 ...

  4. 自己定义GSON类型适配器

    Exception in thread "main" java.lang.RuntimeException: No-args constructor for class java. ...

  5. crawler_java_数据平台结构

    大数据生态架构

  6. Asp.net Mvc WebSocket

    转载一种仿照Asp.net Mvc思维构建WebSocket服务器的方法 问题场景 Asp.net Mvc提供了DependencyResolver.Routing.Filter. Modelbind ...

  7. Errors occurred during the build. Errors running builder 'JavaScript Validator' on

    eclipse又一次编译时候就会报错Errors occurred during the build. Errors running builder 'JavaScript Validator' on ...

  8. 在 MVC6 中创建 Web API

    ASP.NET 5系列教程 (六): 在 MVC6 中创建 Web API   ASP.NET 5.0 的主要目标之一是统一MVC 和 Web API 框架应用. 接下来几篇文章中您会了解以下内容: ...

  9. Front End Books

    Front End Books 记录和推荐一些认为还不错的前端方面的书籍.列入标准: 看过,并觉得值得推荐给大家的. 正在看的,已经觉得不错的,或者听闻别人说不错的. 打算看的,经多人推荐,一致认为必 ...

  10. Java之String类的使用细节

    String类的特点:     字符串对象一旦被初始化就不会被改变,字符串存储在字符串常量池中(字符串缓冲区).如果池中没有就创建,如果有就直接拿过来用.  代码验证如下:     String s ...