在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! ------- 下载Xcode后,使用Max OS X Cocoa Application 模板创建一个新项目之后,就会得到一个如图所示的项目。可能需要打开其中的某些组(记住文件夹图标表示Xcode中的一个组,而不是磁盘上的一个文件夹)但基本界面与下图类似。在开发过程中,一些文件可能被重命名或者被其他文件所取代,但整个结构将保持不变。
Products组可能会以红色显示应用。红色的文件名表明文件缺失,在构建项目之后,应用文件会变回黑色,表明这个文件现在已经在磁盘上。 警告 :跟踪缺失的文件 当其他文件一个显示红色时是一个警告信息,若使用一个模板创建一个新的项目,并且除产品之外的其他文件缺失,那么这表明一定出了某种错误,需要退出Xcode,删除项目,然后重新创建项目。 项目会包括这种各样的文件,文件的扩展名,表明了文件的类型~ Plist文件是属性列表文件,这些XML文件包含一个存储键/值,plist文件被广泛应用于存储应用的设置信息,通过修改项目设置可以间接更新这些文件,如上图 预编译头文件(.pch)能够包含prefix头,这些prefix头回自动被包含进每个文件的编译结果中。与plist一样,通过项目中的相关界面可以更新这些文件,但需要修改默认设置的情况很少。.pch文件包含了编译器指令,这是很重要的内容。 在C语言(以及其他语言中),.h文件通常作头文件,它们在Objective—C中也充当着同样的角色。Objective—C是基于消息的,实现消息指令的文件(即包含头文件的实现代码的文件)的扩展名为.m
使用编译器指令 新建的项目中的文件都是比较小的,因此很容易就能掌握其结构和内容,所有这些文件都使用了编译器指令,因此以这些文件作为切入点来分析编译器指令时一个明智的决定。 编译器指令时编译器在编译文件之前,执行的一组指令,因此它们有些时候也被成为预处理指令或者预处理命令。 1.使用基本指令 本文主要介绍的是很多指令的基础构建模块是定义指令:#define。 宏定义最简单的形式是定义一个字符串替换,如: #define pi 3.14159265 允许编写下面这样的代码。 X= pi * 2; 在开始编译之前,这行代码会转换为 X=3.14159265 * 2; 另一种形式的宏定义允许定义一个类函数的宏,宏中可以包含一个或多个值,在代码中调用宏时可以提供相应的值。 尽管宏定义是一种处理硬编码诸如pi之类的常量的便捷方式,但他们还可以用于指示是否存在特定的功能。当宏定义用于检测某项功能是否存在时,我们所关注的就只有特定标识符是否被定义成了宏。因此一下代码 #def pi 仅仅测试pi是否被定义成了一个宏,它不会输出任何值。当作宏为标记使用时通常会根据一些标志符,是否被定义过来选择处理或不处理一段代码。 2.Prefix头初探 现在可以查看prefix头了,程序清单,给出了,创建简单的Mac应用时自动生成的.pch文件 // //prefix header for all source flies of the 'Simple Mac App' //target in the 'Simple Mac App' project // #ifdef _OBJC_ #import <Cocoa/Cocoa.h> #endif 上述代码检测_OBJC_是否被定义了。标识符前面和后面的双下划线,是一种命名规则,表明这是一个内部的值。在本例中,Objective—C环境中定义_OBJC_.如果该标志符是已定义的话,将会引入Cocoa框架,这就涉及了另一个指令:#import。 // //prefix header for all source flies of the 'Simple ios App' //target in the 'Simple ios App' project // #import <availability.h> #ifndef _IPHONE_3_0 #warning "This project uses features only available in iOS SDK 3.0 and later." #endif #ifdef_OBJC_ #import <UIKit/UIKit.h> #import <Foundation/Foundation.h> #endif 在C中一个常见的指令是#include,它用来在编译时将一个外部文件包含进待编译文件,就好像该外部文件是待编译文件的一部分。#include指令存在一个问题是很容易造成循环引用从而会造成代码(特别是声明)被避免上述问题,如果一个文件已经被引入了,那么第二个,#import指令不会起作用。 Objective—C编译器在编译程序清单中的代码中将Cocoa框架的Cocoa.h文件引入进来。<和>表示该文件是来自框架的——本例是Cocoa框架。 简单程序清单Ios应用的Prefix头 这个prefix头首先会无条件的引入一个文件,然后没有像前面的的例子那样检测是否定义了标志符_OBJC_,相反,它检测是否未定义某些标识符。在ios3.0的SDK中会定义_IPHONE_3_0。如果标识符为被定义,那么在预处理过程中会生成一个警告信息。在检测完版本之后,它与前面的例子一样是检测是否处于Objective—C环境中,在本例中如果处于Objecttive—C环境中将引入不同的文件。 3.main.m中的普通C代码初探 不管采用MacOS或是iOS模板,使用Objective—C编译器可以编译普通的C代码,操作系统将会调用main.h文件中的main函数以启动应用。 4.浅探使用Objective—C编译器指令是以@打头,它通常用来描述文件中的内容。如在.h文件中@interface指令用来标示文件的接口代码的起始位置,而@end指令标示该段的结束位置。在.m文件中,@implementation指令用来标示实现的起始位置,@end标志结束位置。@protocolMyprotocol,这些实体会在代码中其他位置定义。 Objective—C中字符串使用@进行分隔的,如 @”This is a String” 这里的@符号提醒编译器后面是一个字符串。 小结: Prefix头的作用是——它们通常包含用来确定哪些代码需要进行编译的宏定义,如果,根据所安装的SDK的版本来进行条件编译。
|
请发表评论