浅谈Objective-C编译器指令


------<ahref="http://www.itheima.com"target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流!-------

下载Xcode后,使用MaxOSXCocoaApplication模板创建一个新项目之后,就会得到一个如图所示的项目。可能需要打开其中的某些组(记住文件夹图标表示Xcode中的一个组,而不是磁盘上的一个文件夹)但基本界面与下图类似。在开发过程中,一些文件可能被重命名或者被其他文件所取代,但整个结构将保持不变。

Products组可能会以红色显示应用。红色的文件名表明文件缺失,在构建项目之后,应用文件会变回黑色,表明这个文件现在已经在磁盘上。

警告:跟踪缺失的文件

当其他文件一个显示红色时是一个警告信息,若使用一个模板创建一个新的项目,并且除产品之外的其他文件缺失,那么这表明一定出了某种错误,需要退出Xcode,删除项目,然后重新创建项目。

项目会包括这种各样的文件,文件的扩展名,表明了文件的类型~

Plist文件是属性列表文件,这些XML文件包含一个存储键/值,plist文件被广泛应用于存储应用的设置信息,通过修改项目设置可以间接更新这些文件,如上图

预编译头文件(.pch)能够包含prefix头,这些prefix头回自动被包含进每个文件的编译结果中。与plist一样,通过项目中的相关界面可以更新这些文件,但需要修改默认设置的情况很少。.pch文件包含了编译器指令,这是很重要的内容。

C语言(以及其他语言中),.h文件通常作头文件,它们在ObjectiveC中也充当着同样的角色。ObjectiveC是基于消息的,实现消息指令的文件(即包含头文件的实现代码的文件)的扩展名为.m

使用编译器指令

新建的项目中的文件都是比较小的,因此很容易就能掌握其结构和内容,所有这些文件都使用了编译器指令,因此以这些文件作为切入点来分析编译器指令时一个明智的决定。

编译器指令时编译器在编译文件之前,执行的一组指令,因此它们有些时候也被成为预处理指令或者预处理命令。

1.使用基本指令

本文主要介绍的是很多指令的基础构建模块是定义指令:#define

宏定义最简单的形式是定义一个字符串替换,如:

#definepi3.14159265

允许编写下面这样的代码。

X=pi*2

在开始编译之前,这行代码会转换为

X=3.14159265*2

另一种形式的宏定义允许定义一个类函数的宏,宏中可以包含一个或多个值,在代码中调用宏时可以提供相应的值。

尽管宏定义是一种处理硬编码诸如pi之类的常量的便捷方式,但他们还可以用于指示是否存在特定的功能。当宏定义用于检测某项功能是否存在时,我们所关注的就只有特定标识符是否被定义成了宏。因此一下代码

#defpi

仅仅测试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_是否被定义了。标识符前面和后面的双下划线,是一种命名规则,表明这是一个内部的值。在本例中,ObjectiveC环境中定义_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指令不会起作用。

ObjectiveC编译器在编译程序清单中的代码中将Cocoa框架的Cocoa.h文件引入进来。<>表示该文件是来自框架的——本例是Cocoa框架。

简单程序清单Ios应用的Prefix



这个prefix头首先会无条件的引入一个文件,然后没有像前面的的例子那样检测是否定义了标志符_OBJC_,相反,它检测是否未定义某些标识符。在ios3.0SDK中会定义_IPHONE_3_0。如果标识符为被定义,那么在预处理过程中会生成一个警告信息。在检测完版本之后,它与前面的例子一样是检测是否处于ObjectiveC环境中,在本例中如果处于ObjecttiveC环境中将引入不同的文件。

3.main.m中的普通C代码初探

不管采用MacOS或是iOS模板,使用ObjectiveC编译器可以编译普通的C代码,操作系统将会调用main.h文件中的main函数以启动应用。

4.浅探使用ObjectiveC编译器指令是以@打头,它通常用来描述文件中的内容。如在.h文件中@interface指令用来标示文件的接口代码的起始位置,而@end指令标示该段的结束位置。在.m文件中,@implementation指令用来标示实现的起始位置,@end标志结束位置。@protocolMyprotocol,这些实体会在代码中其他位置定义。

ObjectiveC中字符串使用@进行分隔的,如

@”ThisisaString”

这里的@符号提醒编译器后面是一个字符串。

小结:

Prefix头的作用是——它们通常包含用来确定哪些代码需要进行编译的宏定义,如果,根据所安装的SDK的版本来进行条件编译。

优质内容筛选与推荐>>
1、最大子段和问题
2、利用千人基因组数据库查看SNP在不同地区、国家、洲的频率及个数
3、【python】-- try except (异常捕获)、断言
4、JAVA相关知识
5、浏览器截取滚动屏幕、截取整个网页插件


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号