使用#import导入了Foundation框架的主头文件后,就可以开始利用Cocoa特性编写代码了。Hello Objective-C中的第一行实际代码使用了NSLog()代码,如下所示:
NSLog(@”hello , Objective-C !”);
此代码可向控制台输出”hello , Objective-C !”。如果你使用过C语言,那么一定遇到过printf(),而NSLog()这个Cocoa函数的作用和printf()很相似。
和Printf()一样,NSLog()接受一个字符串作为其第一个参数,该字符串可包含格式说明符(如%d)。此函数还可以接受匹配格式说明符的其他参数,printf()可在打印之前将这些参数插入到作为第一个参数的字符串中。
Objective-C只是增加了一点“特殊调料”的C语言,所以可以用printf()代替NSLog()。但我们建议使用NSLog(),因为它添加了特性,例如世界戳、日期戳和自动附加换行符(’\n’)等。
你也许需不太理解函数名NSLog()。这里的“NS”是什么意思?其实,Cocoa对其所有函数、常量和类型名称都添加了“NS”前缀。这个前缀告诉你函数来自Cocoa而不是其他工具包。
两个不同食物使用相同表示服时会导致名称冲突,而前缀可以预防这个大问题。如果Cocoa将此寒食命名为Log(),那么这个名称很可能和一些程序员创建的Log()函数冲突。当包含Log()的程序和Cocoa一起创建时,Xcode会警告Log()被多次定义,将产生糟糕的结果。
前缀为何是“NS”而不是“Cocoa”?“NS”前缀的来历要追随至此工具包还被称为NextSTEP,而且是NeXT software公司(前NeXT公司,于1996年被苹果公司收购)产品的时候,但品故宫公司没有破坏为NextSTEP便携的代码的兼容性,继续使用“NS”前缀,由此可见,“NS”是历史遗存了。
Cocoa已占用了“NS”前缀,所以很明显,不应该再为自建的变量或函数名称添加前缀“NS”。否则处理代码的阅读器会发生混乱,它们会认为你创建的内容实际上属于Cocoa。同样,假如将来苹果公司为Cocoa添加了一个函数,碰巧和你创建的名称相同,那么你的代码可能会出现问题。由于没有集中管理的前缀注册表,所以可以任意选择前缀。很多人使用他们的姓名首字母或公司名称作为前缀,为了使我们的例子更简单,本书中不为代码添加前缀。
看下面NSLog()语句:
NSLog(@”Hello , Objective-C !”);
你是否注意到了字符串前的@符号?这是Objective-C在标准C语言基础上添加的特性之一。双引号中的字符串前有一个@符号,这表示引用的字符串应该作为Cocoa的NSString元素来处理。
什么是NSString元素?去掉“NS”前缀后,就可以看到熟悉的术语“String”。你已经知道字符串就是一串字符,所以你一定能猜到NSString就是Cocoa中的一串字符。
NSString元素有许多打包的特性,Cocoa在需要字符串时可随时使用它们。下面是一些NSString功能。
告知其长度;
将自身与其他字符串比较;
将自身转换为整型值或浮点值。
还有许多功能是使用C风格字符串无法实现的。
观察这些字符串
一个易犯的错误是将C风格字符串(而不是专门的NSString的@“字符串”元素)传递给MSLog(),如果是这样,编译器会给出警告:
main.m:46: warning:passing arg 1 of ‘NSlog’ fromincompatible pointer type
如果要运行这个程序,它可能会崩溃,要捕捉这样的问题,可以让Xcode总是将警报作为错误来处理,方法是,选择Xcode Groups & Files列表顶端的项目,选择File—Get Info命令,选择Build选项卡,在搜索区输入“error”,然后勾选Treat Warnings
as Error复选框。