Objective-C开发——NSLog()和@”字符串”

       使用#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复选框。

相关文章

我正在用TitaniumDeveloper编写一个应用程序,它允许我使用Ja...
我的问题是当我尝试从UIWebView中调用我的AngularJS应用程序...
我想获取在我的Mac上运行的所有前台应用程序的应用程序图标....
我是一名PHP开发人员,我使用MVC模式和面向对象的代码.我真的...
OSX中的SetTimer在Windows中是否有任何等效功能?我正在使用...
我不确定引擎盖下到底发生了什么,但这是我的设置,示例代码和...