Objective-C学习中对 C语言的扩展


  本文标签:Objective-C C语言 BOOL

  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)处理  。

  1. #import 

  和C语言一样,Objective-C使用头文件来包含元素声明,这些元素包括结构体、符号常量、函数原型等  。C语言使用#include语句通知编译器应在头文件中查询定义,而在Objective-C程序中通常会使用#import来实现这个目的  。

  #import可保证头文件只被包含一次,而不论此命令实际上在那个文件中出现了多少次  。在C语言中,程序员通常使用基于#ifdef命令的方案来避免一个文件包含另一个文件,而后者又包含第一个文件的情况  。而在Objective-C中,程序员使用#import实现这个功能  。

  1. #import <Foundation/Foundation.h>  

  此语句告诉编译器查看Foundation框架中的Foudation.h头文件  。Foudation框架处理的是用户界面之下的层(Layer)中的特性,例如数据结构和通信机制,Objective-C中的大多数程序都以Foundation框架为基础  。

  1. NSLog()和@"字符串" 

  Cocoa对其所有函数、常量和类型名称都添加了"NS"前缀,这个前缀告诉程序员和编译器函数来自Cocoa而不是其他工具包  。两个不同工具包使用相同标识符时会导致名称冲突,而前缀可以预防这个大问题  。由于没有集中管理的前缀注册表,所以程序员可以任意选用前缀,许多人使用他们的姓名首字母或公司名称作为前缀  。鉴于Cocoa已占用了"NS"前缀,程序员在为自建的变量或函数名称添加前缀时就不应该再用"NS"了,以免发生混乱  。

  NSLog()这个Cocoa函数和C语言中的printf()很相似,它接受一个字符串作为其第一个参数,该字符串可包含格式说明符(如%d),还可以接受匹配格式说明符的其他参数  。NSLog()函数和printf()函数的区别在于,前者添加了一些特性,例如时间戳、日期戳和自动附加换行符(\n)等  。beauty注:这个特性太有用了,我所有的VC程序中都有自己写的一个函数WriteLog(),完成的是和NSLog()几乎一样的功能  。

  我们来看下这条NSLog()语句:

  1. 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(),编译器会给出警告:

  1. 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语言的扩展的内容介绍完了,希望本文对你有所帮助!