Objective-C学习中对 C 的扩展是本文要介绍的内容,Objective-C和Cocoa是苹果公司Mac OS X操作系统的核心。Objective-C语言是C语言的一个扩展集,许多具备Mac OS X外观的应用程序都是使用该语言开发的。Cocoa是使用Objective-C编写的工具包,它不仅包含Mac OS X用户界面的所有元素,还包含其他许多内容。
Objective-C文件的扩展名是.m,在Xcode中,.m文件、.c文件(标准C程序)、.cpp(C++程序)文件的编译工作都由GCC(GNU Compiler Collection)处理。
- #import
和C语言一样,Objective-C使用头文件来包含元素声明,这些元素包括结构体、符号常量、函数原型等。C语言使用#include语句通知编译器应在头文件中查询定义,而在Objective-C程序中通常会使用#import来实现这个目的。
#import可保证头文件只被包含一次,而不论此命令实际上在那个文件中出现了多少次。在C语言中,程序员通常使用基于#ifdef命令的方案来避免一个文件包含另一个文件,而后者又包含***个文件的情况。而在Objective-C中,程序员使用#import实现这个功能。
- #import <Foundation/Foundation.h>
此语句告诉编译器查看Foundation框架中的Foudation.h头文件。Foudation框架处理的是用户界面之下的层(Layer)中的特性,例如数据结构和通信机制,Objective-C中的大多数程序都以Foundation框架为基础。
- NSLog()和@"字符串"
Cocoa对其所有函数、常量和类型名称都添加了"NS"前缀,这个前缀告诉程序员和编译器函数来自Cocoa而不是其他工具包。两个不同工具包使用相同标识符时会导致名称冲突,而前缀可以预防这个大问题。由于没有集中管理的前缀注册表,所以程序员可以任意选用前缀,许多人使用他们的姓名首字母或公司名称作为前缀。鉴于Cocoa已占用了"NS"前缀,程序员在为自建的变量或函数名称添加前缀时就不应该再用"NS"了,以免发生混乱。
NSLog()这个Cocoa函数和C语言中的printf()很相似,它接受一个字符串作为其***个参数,该字符串可包含格式说明符(如%d),还可以接受匹配格式说明符的其他参数。NSLog()函数和printf()函数的区别在于,前者添加了一些特性,例如时间戳、日期戳和自动附加换行符('\n')等。beauty注:这个特性太有用了,我所有的VC程序中都有自己写的一个函数WriteLog(),完成的是和NSLog()几乎一样的功能。
我们来看下这条NSLog()语句:
- NSLog(@"Hello, Objective-C!");
@符号是Objective-C在标准C语言基础上添加的特性之一。双引号中的字符串前有一个@符号,这表示引用的字符串应该作为Cocoa的NSString元素来处理。
大多数Cocoa元素都以非常直接的方式命名,名称尽量描述出他们可实现的特性。例如,NSArray提供数组,NSDateFormatter帮助程序员用不同方式来格式化日期,NSThread提供多线程变成工具,NSSpeechSynthesizer使用户听到语音。相应的,NSString就是Cocoa中的一串字符。
NSString类型有许多打包的特性,Cocoa在需要字符串时可随时使用它们。下面是一些NSString功能。
(1)告知其长度;
(2)将自身与其他字符串比较;
(3)将自身转换为整型值或浮点值。
还有许多功能是使用C风格字符串无法实现的,以后在使用中会做进一步的说明。
printf()函数中没有和NSString类型相应的格式说明符,因此我们不能将其作为参数传递给printf()函数。而NSLog()函数针对NSString类型添加了%@格式说明符,从而使得NSLog()函数可以接受相应的参数,将其作为NSString使用该字符串中的字符。
如果将C风格的字符串(而不是专门的NSString的@"字符串"元素)传递给NSLog(),编译器会给出警告:
- main.m:46: waring: passing arg 1 of `NSLog` from incompatible pointer type
如果要运行这个程序,他可能会崩溃。要捕捉这样的问题,可以让Xcode总是将警报作为错误来处理。
布尔类型
C语言拥有布尔数据类型bool,它具有true值和false值。Objective-C提供了相似的类型BOOL,它具有YES值和NO值。这两种不同的布尔类型可以在同一个程序中共存,但在编写Cocoa代码时要使用BOOL。
Objective-C中的BOOL实际上是一种对带符号的字符类型(signed char)的定义(typedef),它使用8位存储空间。YES定义为1,而NO定义为0(使用#define)。Objective-C并不将BOOL作为仅能保存YES值或NO值得真正的布尔类型来处理。编译器将BOOL认作8位二进制数,YES值和NO值只是一种约定。这引发了一个小问题:如果不小心将一个长于1字节的整型值(例如short或int值)赋给一个BOOL变量,那么只有低位字节会用作BOOL值。假设该低位字节刚好为0,BOOL值将会是0,即NO值。
小结:Objective-C学习中对 C语言的扩展的内容介绍完了,希望本文对你有所帮助!