一、 项目中的常见文件
** XxxxTest文件夹用来做单元测试。
** Products目录。
* 在Mac程序下,生产的可执行文件app会存放到该目录下。
* iOS程序产生的是ipa文件。这个目录对于iOS程序来说意义不大。
1. info.plist(全局配置文件,非常重要, 不能删除 ):
* 在xcode5中是"项目名称-Info.plist"表示项目的全局配置文件,非常重要。在旧版本xcode中(和xcode6.1),该文件名称就叫Info.plist。
** 注意:自己创建的plist文件中不要包含Info关键字。
* Info.plist中的一些配置项:
1> Bundle display name(在xcode6.1中叫做"Bundle name"), 表示软件安装到手机上后,显示的名称。
** 当修改了该名称后,为了保证有效, 点击Product -> Clean, 同时将软件从模拟器中卸载掉,然后再重新运行。
2> Bundle identifier, app的唯一标识。
3> Bundle version, 每次发布软件的版本号。每次向AppStore上传的同一个软件,新的版本号必须大于旧的,否则无法上传。
4> Main storyboard file base name,对应的就是选中"项目" ->"General" -> "Deployment Info" ->"Main Interface" 中的设置。
5> Supported interface orientations,标识设备所支持的方向。对应的选中"项目" ->"General" -> "Deployment Info" ->"Device Orientation"。iPhone只支持三种方向,不支持上下旋转(iPad支持)。Portrait(竖屏)、Landscape Left(横屏向左)、Landscape Right(横屏向右)。
6> Info.plist就是一个xml文件,用记事本打开看一下。
2. pch文件:(Prefix Header File)(头文件)
* 遇到的问题:
1> 整个项目中很多地方都在使用某个类的头文件。
2> 整个项目中很多地方都在使用同一个"宏"
3> 在项目中很多地方用到了NSLog()函数,想一下子全都清除掉。
* 解决上面的问题,可以通过使用PCH文件(Prefix Header File)。
* pch文件就是一个头文件(类似于*.h文件)。
** 注意: PCH文件的特点,项目中的所有其他代码文件无需显示导入该PCH文件,默认就都可以访问(其他文件无需手动#import该 pch文件就能使用)。
/**
参考代码:
// 假设在整个项目中有多个地方在使用Person类,那么可以在每个使用到Person类的地方都#import "Person.h",或者把#import "Person.h"放到pch文件中。
*/
* 主要作用:
1> 可以放一些公用的宏定义。
2> 把公共的Model类的#import导入写到pch文件中。
3> 自定义NSLog()。例如: #define SteveZLog(...) NSLog(__VA_ARGS__)
** 遇到的问题: 在项目中很多地方用到了NSLog()函数,想一下子全都清除掉。
/** 参考代码:
int age = 20;
NSString *name = @"steve";
NSLog(@"name: %@, age: %d",name, age);
// 在项目中的很多地方都用到了NSLog()
NSLog(@"------------------------");
// 在pch文件中定义如下宏:
// ... 表示SteveZLog可以接受多个参数
// __VA_ARGS__ 表示把用户的 ... 参数传递给NSLog. (VA 表示Value, ARGS表示arguments)
#define SteveZLog(...) NSLog(__VA_ARGS__)
// ===============然后就可以将所有的NSLog替换为SteveZLog了======================
// 当在项目中不再需要NSLog()的时候,只要将SteveZLog中对应的代码注释掉即可:
参考代码:
#define SteveZLog(...) //NSLog(__VA_ARGS__)
*/
* 在xcode6.1中,默认没有创建pch文件。
** 需要自己新建一个
** 创建方式:选择"Supporting Files" ->右键 ->"New File" -> "Other" ->"PCH File" -> "PrefixHeader.pch"。
* 在该文件中定义如下宏:
** #define ABC 10
* 选中项目 -> Build Setting -> All -> 搜索"prefix head" -> 修改Prefix Header的内容为:
** "$(SRCROOT)/$(PRODUCT_NAME)/PrefixHeader.pch" (如果有问题,换下面的方式,可能会与中文有关)
** 或者
** "$(SRCROOT)/对应的文件夹名/PrefixHeader.pch"
/** 参考代码:
pch文件代码:
#define ABC 10
#define Name @""
#import "Person.h"
====================================
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"%d", ABC);
NSLog(@"%@", Name);
// ----------------------
Person *p = [[Person alloc] init];
p.name = @"steve";
NSLog(@"%@", p.name);
}
*/
/*
补充,程序开发阶段分为:
1. 调试阶段,写代码、调错误,需要使用NSLog()。同时在调试阶段系统会自定义一个叫做DEBUG的宏。
2. 发布阶段, 写好的代码生成ipa等压缩文件,上传到AppStore,安装到用户设备上, 不需要NSLog()。同时系同会自动删除叫做DEBUG的宏。
3. 综上所述, 我们可以如下自定义一个NSLog():
#ifdef DEBUG
#define SteveZLog(...) NSLog(__VA_ARGS__)
#else
#define SteveZLog(...)
#endif
4. 所有与OC相关的宏定义都要写在:
#ifdef __OBJC__
#endif
里面,因为写在这个if中的所有内容只有OC代码才可以使用,当在项目中新建了一个.c文件是不可以使用的(不使用就不会报错),否则如果写在了外面,新建一个.c的程序也能使用,就报错了。比如C语言中没有#import,只有#include <xx.h>
参考代码:
#ifndef testPCH_PrefixHeader_pch
#define testPCH_PrefixHeader_pch
// Include any system framework and library headers here that should be included in all compilation units.
// You will also need to set the Prefix Header build setting of one or more of your targets to reference this file.
// 判断如果是OC文件才引入这些宏,如果是普通C语言文件则不引入。否则当在项目中添加C语言文件时报错。
#ifdef __OBJC__
#define ABC 10
#define Name @"赵晓虎-Steve"
#import "Person.h"
#ifdef DEBUG
#define SteveZLog(...) NSLog(__VA_ARGS__)
#else
#define SteveZLog(...)
#endif
#endif
*/
四、程序启动的完整过程
1.main函数
2.UIApplicationMain
* 创建UIApplication对象
* 创建UIApplication的delegate对象
3.delegate对象开始处理(监听)系统事件(没有storyboard)
* 程序启动完毕的时候, 就会调用代理的application:didFinishLaunchingWithOptions:方法
* 在application:didFinishLaunchingWithOptions:中创建UIWindow
* 创建和设置UIWindow的rootViewController
* 显示窗口
3.根据Info.plist获得最主要storyboard的文件名,加载最主要的storyboard(有storyboard)
* 创建UIWindow
* 创建和设置UIWindow的rootViewController
* 显示窗口