Targets
http://blog.sina.com.cn/s/blog_682dc7810100pv8t.html
http://www.shangxueba.com/jingyan/1843732.html
在xcode当中有一个东西叫targets,苹果的官方文档是这样说的:
A target specifies a product to build and contains the instructions for building the product from a set of files in a project or workspace. A target defines a single product; it organizes the inputs into the build system—the source files and instructions for processing those source files—required to build that product. Projects can contain one or more targets, each of which produces one product.(省略若干字)
简单翻译过来就是一个target详细说明了要构建的产品,包含了一个工程或工作目录中的文件当中的指令,貌似还是不太清楚。在谷歌搜了一下,发现这个关于target的解释还是不错的:
A target basically defines what it is you are building and how you are building it. You can add more targets if you would like to build more than one thing. This usually makes sense if you need to build several related things from the same project. For instance, you might want one target for a full, paid version of an application, and another target for a reduced, free version of an application. Both targets would include much of the same code and resources, but some of the settings would be different and you might have different files included with each.
意思就是如果你想将一个应用分为付费完整版和免费简化版,这两个版本大部分代码是一样的,只有个别的设置和包含的文件不同,你就可以建一个application然后弄两个targets分别对应两个版本。
下面举个简单的例子来说明在iOS7.0和iOS6.1(以及更低版本)之间的适配问题(用的是xcode5.0,里边有6.1和7.0两个版本的sdk)
新建一个工程,默认的development target,base sdk以及模拟器的版本都是7.0,在AppDelegate中的didFinishLaunchingWithOptions方法里写下
self.window.tintColor = [UIColor redColor];
然后运行,这样是没有任何错误的。接下来将development target,base sdk以及模拟器的版本都改成6.1(注意默认的xcode是没有6.1的sdk的,需要自己另外导入)。然后运行,就会报错:
也就是说tintColor属性在iOS6.1中根本就没有,在编译时候就会出错。这时候如下加上判断语句也是没有用的,照样报错
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) { self.window.tintColor = [UIColor redColor]; }
遇见这种情况只能加上预处理语句,这样写:
#ifdef __IPHONE_7_0 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) { self.window.tintColor = [UIColor redColor]; }#endif
这样编译通过就不会报错了……这是因为在sdk6.1下的usr/include下边有一个Availability.h文件,里边定义了一大堆宏,其中关于iphone的有
#define __IPHONE_2_0 20000#define __IPHONE_2_1 20100#define __IPHONE_2_2 20200#define __IPHONE_3_0 30000#define __IPHONE_3_1 30100#define __IPHONE_3_2 30200#define __IPHONE_4_0 40000#define __IPHONE_4_1 40100#define __IPHONE_4_2 40200#define __IPHONE_4_3 40300#define __IPHONE_5_0 50000#define __IPHONE_5_1 50100#define __IPHONE_6_0 60000#define __IPHONE_6_1 60100#define __IPHONE_NA 99999 /* not available */
而sdk7.0里边多了一行
#define __IPHONE_7_0 60100
Project
http://book.2cto.com/201307/27017.html
http://book.2cto.com/201307/26992.html
2.5 设置产品属性
在前面讲解应用生命周期时,为了禁止应用在后台运行,我们将HelloWorld-Info.plist文件中的Application does not run in background属性修改为YES(即UIApplicationExitsOnSuspend = YES),这项操作就属于产品属性的设置。在Xcode中,产品与Target直接相关,而Target与Project直接相关。
2.5.1 Xcode中的Project和Target
打开HelloWorld工程时,我们会看到如图2-30所示的界面。产品属性包括Project和Target两块内容。一个工程只有一个Project,但可以有一个或多个Target。
图2-30 Xcode的Project和Target
我们所创建的HelloWorld只有一个Target,下面我们为之前使用故事板实现的HelloWorld工程增加一个Target。
首先,依次选择File→New→Target菜单项,此时会弹出一个模板选择对话框,如图2-31所示。
图2-31 选择Target模板对话框
这里选择的模板与新建工程时选择的模板完全一样,然后点击Next按钮,将出现如图2-32所示的对话框。
根据情况逐一设定后,点击Finish按钮,现在我们已经成功为HelloWorld新增了一个Target。查看左边的导航面板,可以发现右边有两个Target,并同时生成一套完整的文件——main.m、AppDelegate、ViewController和MainStoryboard.storyboard,它们独立于原来的Target而存在,如图2-33所示。
图2-32 Target的一些选项设定图2-33 新创建Target
要指定运行哪一个Target,可以通过选择不同的Scheme来实现。如图2-34所示,在Xcode的左上角选择HelloWorld_Storyboard→iPhone 6.0 Simulator,就可以在iPhone 6.0 Simulator上运行HelloWorld_ Storyboard Target了。
图2-34 选择Scheme