1.程序配置文件info.plist,全局头文件pch

工程的配置中Info选项里面的内容实际上是info.plist文件里面的内容的拷贝,info.plist里面存放了许多关于项目启动参数的配置信息。应该注意:若想往项目中添加自定义的plist文件,应该使文件名中不包含info。info.plist修改和其他的plist文件修改方式一样,都是键值对的修改。但是要注意的是当使用Source Code方式打开该文件的时候,键名和用plist方式打开时不一样。就xml源码文件讨论,键名分为以下几种:

Core Foundation Keys

该类的keys的特点是以CF为前缀,用以代表Core Foundation,描述了一些常用的行为项
Lanch Services Keys
加载服务项,提供了App加载所依赖的配置,描述了app启动的方式选择。

Cocoa Keys
Cocoa框架或Cocoa Touch框架依赖这些keys来标识更高级别的配置项目,如app的main
nib文件,主要类。这些key描述影响着Cocoa和Cocoa Touch框架初始化和运行app的运行方式

UIKit Keys
描述IOS Apps的行为,每个IOS应用都依赖于Info.
plist的keys来与IOS系统通信。Xcode提供了生成的plist文件提供了所有app所需的那些比较重要的keys。
但app可能需要扩展默认的plist来描述更多的信息,如定制app启动后的默认旋转方向,标识app是否支持文件共享等等。

OS X Keys
描述了Mac Apps的行为。

下面是一些常用的键的意义:

1.Localiztion native development region --- CFBundleDevelopmentRegion 本地化相关,如果⽤户所在地没有相应的语言资源,则用这个key的value来作为默认

2.Bundle display name --- CFBundleDisplayName 设置程序安装后显示的名称。应⽤程序名称限制在10-12个字符,如果超出,将被显示缩写名称。

3.Executaule dile -- CFBundleExecutable 程序安装包的名称

4.Bundle identidier --- CFBundleIdentidier 该束的唯一标识字符串,该字符串的格式类似 com.yourcompany.yourapp,如果使⽤用模拟器跑你的应用,这个字段没有用处,如果你需要把你的应⽤部署到设备上,你必须⽣成一个证书,⽽而在⽣生成证书的时候,在apple的⽹网站上需要增加相应的app IDs.这⾥有一个字段Bundle identidier,如果这个Bundle identidier是一个完整字符串,那么文件中的这个字段必须和后者完全相同,如果app IDs中的字段含有通配符*,那么文件中的字符串必须符合后者的描述。

5.InfoDictionary version --- CFBundleInfoDictionaryVersion Info.plist 格式的版本信息

6.Bundle name --- CFBundleName 产品名称

7.Bundle OS Type code -- CFBundlePackageType ⽤来标识束类型的四个字母长的代码

8.Bundle versions string, short --- CFBundleShortVersionString ⾯向用户市场的束的版本字符串

9.Bundle creator OS Type code --- CFBundleSignature 用来标识创建者的四个字母长的代码

10.Bundle version --- CFBundleVersion 应⽤程序版本号,每次部署应用程序的一个新版本时, 将会增加这个编号,在app store上用的。

11.Application require iPhone environment -- LSRequiresIPhoneOS 用于指示程序包是否只能运行在iPhone OS 系统上。Xcode自动加入这个键,并将它的值设置为true。您不应该改变这个键的值。

12.Main storybard dile base name -- UIMainStoryboardFile 这是一个字符串,指定应用程序主nib文件的名称。

13.supported interface orientations -- UISupportedInterfaceOrientations 程序默认支持的设备方向。

pch文件,是prefix header file。是程序运行起来后的全局头文件,当添加了该文件后,不用在其他文件中使用#include或者是#import导入该文件,就可以直接使用该文件中的各种内容,比如宏定义和常量和一些公用的类。在xcode5及之前可以直接使用pch文件,在xcode6之后需要在Build Settings中的Apple LLVM 6.0-Language项中的Prefix Header条目中,设置pch文件所在的目录为$(SRCROOT)/对应的文件夹名/PrefixHeader.pch,例如在根目录中 可以直接设置$(SRCROOT)/PrefixHeader.pch

当程序中的NSLog较多时,会造成很大的性能问题(NSLog是一个IO操作),对于发布程序是非常不好的,如果依次找到程序中的所有NSLog并将他们删除或者注释,工程项是巨大的,因此可以是用在pch中设置一个条件编译,如果是在调试状态下NSLog为正常的代码,如果在发布状态下则忽略他们。

#ifdef DEBUG
#define NSLog(...); NSLog(__VA_ARGS__);
#else
#define NSLog(...);
#endif

在调试状态下__VA_ARGS__的内容会替换为...中的内容(这是宏定义中提取方法参数中常用的方法),而在发布状态的时候,则直接忽略了NSLog(...)

ios开发中难免会遇到一些oc与c混编的时候,当使用了pch文件时,c文件是不会识别上面的条件编译和#import等指令的,这时候应该使用另外一个条件编译来避免出现问题:

#ifdef __OBJC__
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#endif

2.应用程序对象UIApplication介绍

UIApplication是一个单例类,可以做一些应用级别的操作
1.应用图标右上角的消息条数applicationIconBadgeNumber
2.联网操作时,状态栏上的等待图标指示器。waiting图标。networkActivityIndicatorVisible
3.利用UIApplication打开某个资源
** 打开一个网页:
[app openURL:[NSURL URLWithString:@"http://ios.icast.cn"]];

** 打电话
[app openURL:[NSURL URLWithString:@"tel://10086"]];

** 发短信
[app openURL:[NSURL URLWithString:@"sms://10086"]];

** 发邮件
[app openURL:[NSURL URLWithString:@"mailto://12345@qq.com"]];
4.通过UIApplication管理状态栏:
iOS7开始可以通过两种方式来控制状态栏
1> 控制器- (BOOL)prefersStatusBarHidden
- (UIStatusBarStyle)preferredStatusBarStyle
2>.UIApplication
如果希望通过UIApplication来管理,步骤如下:
1> 在Info.plist文件中增加一个配置项
* View controller-based status bar appearance = NO,
2>然后编写如下代码:// 还可以用方法调用的形式,这样是可以设置动画的

app.statusBarHidden = YES;
app.statusBarStyle

3.UIApplicationDelegate介绍,程序启动过程

在main函数中进行的设置UIApplication对象的代理。
App容易受到干扰。正在玩游戏,一个电话打过来了。
* 应用程序的生命周期事件(如程序启动和关闭)
* 系统事件(如来电)
* 内存警告
* … …
** 处理这些干扰事件,就要用到AppDelegate代理对象了。

** 总结: AppDelegate的主要作用就是处理(监听)应用程序本身的各种事件:
* 应用程序启动完毕

* 应用程序进入后台
* 应用程序进入前台
* 内存警告

* 等等, 都是应用程序自身的一些事件

** 要想成为UIApplication的代理对象, 必须遵守:UIApplicationDelegate协议。
** 代理中的若干方法介绍:
1. - (BOOL)application: didFinishLaunchingWithOptions:
// app第一次启动完毕后就会调用(当程序启动后会显示一张启动图片, 当这个图片显示完毕, 消失后, 就开始调用这个方法)

2. - (void)applicationDidEnterBackground:(UIApplication *)application
// 当程序进入后台时, 调用该方法。(比如:按了Home键, 或者一个电话打过来了, 当前程序都会进入后台。)
// 在这个方法中可以做一些保存当前程序数据, 暂停程序的操作。

3. - (void)applicationWillEnterForeground:(UIApplication *)application
// 当程序再次进入前台的时候调用。

4. - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
// 当发生内存警告时触发该事件。
程序启动后:
didFinishLaunchingWithOptions-->applicationDidBecomeActive
按home键使程序进入后台:applicationWillResignActive--->applicationDidEnterBackground
让程序会到主界面:applicationWillEnterForeground--->applicationDidBecomeActive
在主界面时让程序退出:applicationDidEnterBackground--->applicationWillTerminate
在后台时退出:applicationWillTerminate

4.UIWindow对象

** UIWindow是一种特殊的UIView, UIWindow也是继承自UIView。

** 通常一个app只会有一个UIWindow对象。

** iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的view,最后将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了
** 一个iOS程序之所以能显示到屏幕上,完全是因为它有UIWindow

** 在文档中找: Cocoa Touch Layer -> UIKit -> Guides -> View Controller Programming Guide for iOS -> View Controller Basics -> 关于UIWindow与控制器View的关系图片。

** 创建过程UIWindow -> UIViewController -> UIView -> 把UIView加到UIWindow对象中。

5.程序界面显示出来的过程

当配置了启动的时候使用main.storyboard的时候, 此时, 当程序启动完毕后, 会自动创建UIWindow,
然后再根据main.storyboard文件创建对应的控制器, 以及控制器中的view. 然后把控制器的View添加到UIWindow上.然后我们就看到界面了.

如果没有为项目配置启动的时候使用哪个storyboard, 那么应用程序启动完毕以后不会创建UIWindow对象,
以及对应的控制器等等.这时就需要自己去创建

在app代理类的FinishLaunching中

self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];

// 创建一个控制器, 然后把控制器设置给UIWidnow
MKViewController *mkViewCotroller = [[MKViewController alloc] init]; // 设置hmVc为self.window的根控制器
self.window.rootViewController = mkViewCotroller; // 把这个(self.window)设置为主窗口, 并且显示出来
[self.window makeKeyAndVisible];

需要注意的是:
不要直接把控件添加到UIWindow上, 而是要现创建控制器, 然后向控制器所管理的view中添加子控件, 然后把控制器设置给UIWindow.
原因:
1> UIWindow一直会存在, 直到应用程序退出.所有加到UIWindow中的子控件也就一直会被UIWindow强引用.
2> 如果直接把子控件加到UIWindow中, 那么所有子控件的事件都需要让应用程序代理来监听.
实际是应该让对应的控制器来监听这些事件.
3> 当屏幕旋转的时候, UIWindow监听到了这个旋转事件, 然后把它传递给控制器, 控制器再让对应的子控件做旋转.如果要是直接向UIWindow中添加子控件, 那么就没有控制器, 子控件无法监听旋转事件.

6.总结程序启动完整过程

(有storyboard和没有storyboard的分别总结)

没有storyboard文件

1. 调用main函数。

2. 调用UIApplicationMain函数。

3. 创建UIApplication对象 、 AppDelegate对象

4. 设置UIApplicatio对象的代理是AppDelegate对象。

5. AppDelegate对象开始监听"系统事件(应用程序的事件)",进入"事件循环"。

6. 程序启动完毕后调用 application: didFinishLaunchingWithOptions:方法。

----7. 在application: didFinishLaunchingWithOptions:方法中创建:
* UIWindow

* 控制器
* 设置UIWindow的根控制器是刚才创建的控制器

* 显示UIWindow

有storyboard文件

1. 调用main函数。

2. 调用UIApplicationMain函数。

3. 创建UIApplication对象 、 AppDelegate对象

4. 设置UIApplicatio对象的代理是AppDelegate对象。

5. AppDelegate对象开始监听"系统事件(应用程序的事件)",进入"事件循环"

6. 程序启动完毕后调用 application: didFinishLaunchingWithOptions:方法。

----7. 在application: didFinishLaunchingWithOptions:方法中创建:
* 系统自动创建UIWindow对象。
* 根据Info.plist文件配置(Main Interface),找到需要加载的storyboard文件(Main.storyboard)

* 找到Main.storyboard中的Is Initial View Controller 对应的控制器类, 创建该控制器对象。

* 根据storyboard中的配置, 创建控制器对应的view。

* 设置UIWindow的根控制器(rootViewController)为刚才创建的控制器。

* 显示UIWindow([self.window makeKeyAndVisible])。

info.plist、pch和四大对象(UIApplication、UIApplicationDelegate、UIWindow、UIViewController)的更多相关文章

  1. UIKit中的几个核心对象的介绍:UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍

    UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍 一:UIApplication:单例(关于单例后面的文章中会详细介绍,你现在只要知道 ...

  2. VFS四大对象之一 struct super_block

    linux虚拟文件系统四大对象: 1)超级块(super block) 2)索引节点(inode) 3)目录项(dentry) 4)文件对象(file) 现在先介绍第一个 一.super_block的 ...

  3. PYTHON BS 四大对象

    BeautifulSoup是灵活又方便的网页解析库,处理搞笑,支持多种解析器利用它不用编写正则表达式即可方便地实现网页信息的提取BS的四大对象:1.TagTag就是HTML中的一个个标签,例如:< ...

  4. python学习之----BeautifulSoup的find()和findAll()及四大对象

    BeautifulSoup 里的find() 和findAll() 可能是你最常用的两个函数.借助它们,你可以通 过标签的不同属性轻松地过滤HTML 页面,查找需要的标签组或单个标签. 这两个函数非常 ...

  5. Linux 虚拟文件系统四大对象:超级块、inode、dentry、file之间关系

    更多嵌入式原创文章,请关注公众号:一口Linux 一:文件系统 1. 什么是文件系统? 操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统. 通常文件系统是用于存储和组织文件的一 ...

  6. iOS开发——UI精选OC篇&UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍

    UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍 一:UIApplication:单例(关于单例后面的文章中会详细介绍,你现在只要知道 ...

  7. UIApplication,UIWindow,UIViewController,UIView(layer)

    转载自:http://www.cnblogs.com/iCocos/p/4684749.html UIApplication,UIWindow,UIViewController,UIView(laye ...

  8. ios存储 plist 偏好设置 自定义对象存储

    1,plist Plist注意:不能存储自定义对象 Plist:数组和字典,  如何判断一个对象能不能使用Plist,就看下有没有writeToFile 获取应用的文件夹(应用沙盒) NSString ...

  9. VFS四大对象之四-struct file

    继上一篇文章: http://www.cnblogs.com/linhaostudy/p/7428971.html 四.file结构体 文件对象:注意文件对象描述的是进程已经打开的文件.因为一个文件可 ...

随机推荐

  1. .NET 多个程序配置文件合并到主app.config

    .NET 多个程序配置文件合并到主app.config

  2. LInux升级Python版本2.7.11所遇问题汇总

    首先请原谅我使用校园网络,基本上打不开谷歌,网络搜取得帮助均来自度娘. 对于我这个linux新手 IT 新手来说,自己升级点东西好担心,万一出错,可能都要重来.... 参照度娘内容和自己摸索,今天晚上 ...

  3. [Scala] 快学Scala A1L1

    基础 1.1 声明值和变量 在Scala中,鼓励使用val; 不需要给出值或变量的类型,这个信息可以从初始化表达式推断出来.在必要的时候,可以指定类型. 在Scala中,仅当同一行代码中存在多条语句时 ...

  4. [Python] 机器学习库资料汇总

    声明:以下内容转载自平行宇宙. Python在科学计算领域,有两个重要的扩展模块:Numpy和Scipy.其中Numpy是一个用python实现的科学计算包.包括: 一个强大的N维数组对象Array: ...

  5. PHP读写大“二进制”文件,不必申请很大内存(fopen、fread、fwrite、fclose)

    <?php /** * 读写大二进制文件,不必申请很大内存 * 只有读取到内容才创建文件 * 保证目录可写 * * @param string $srcPath 源文件路径 * @param s ...

  6. Go - 字典(map)

    字典是一种内置的数据结构,用来保存 键值对 的 无序集合. (1)字典的创建 1) make(map[KeyType] ValueType, initialCapacity) 2) make(map[ ...

  7. 告别我的OI生涯

    本文章写于2008年12月15日. 随着2008noip的结束,我也结束了我的OI生涯. 信息竞赛也许是从小到大让我最最努力的一件事.我记得参加2006noip初赛前,每天中午为了上信息课都吃不上中午 ...

  8. ASM:《X86汇编语言-从实模式到保护模式》第16章:Intel处理器的分页机制和动态页面分配

    第16章讲的是分页机制和动态页面分配的问题,说实话这个一开始接触是会把人绕晕的,但是这个的确太重要了,有了分页机制内存管理就变得很简单,而且能直接实现平坦模式. ★PART1:Intel X86基础分 ...

  9. Ionic常用命令行解释

    原文链接 安装ionic npm install -g ionic 更新www/lib/ionic 目录的文件,如有项目中有bower,此命令会运行bower update ionic, 否则则会从C ...

  10. hdu 1300 Pearls

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=1300 思路:用dp[i]表示前i种花费最低的情况,则有dp[i]=min(dp[i],dp[j+1]+(( ...