mnbvcxz 2011-06-10
3.3.7 Cocoa数字类型
本节中的类型不是Objective-C语言的一部分。它们都定义于Cocoa框架中,但是,我们会看到它们经常在这里提及。从Mac OS X 10.5开始,Apple已经使用定义的类型替代了Cocoa框架中int和float的大多数出现,而定义的类型的长度取决于代码是编译为32位可执行程序还是64位可执行程序(参见附录C)。
NSInteger
NSInteger替代了Cocoa框架中大多数int的出现。它在32位环境中定义为int,在64位环境中定义为long(64位整数)。
NSUInteger
NSUInteger是NSInteger的无符号形式。它替代了Cocoa框架中的大多数unsigned的出现。在32位环境中,它是一个无符号的32位整数;在64位环境中,它是一个无符号的long(无符号的64位整数)。
CGFloat
CGFloat替代了float。当针对32位环境编译的时候,它是一个float(32位);当针对64位环境编译的时候,它是一个double(64位)。Foundation框架提供了一个定义的常量,CGFLOAT_IS_DOUBLE,如果需要通过编程知道CGFloat在当前的环境中是一个float还是一个double,使用下面的语句:
if ( CGFLOAT_IS_DOUBLE ) NSLog( @"Double !\n"); else NSLog(@"Float !\n");
NSLog
NSLog是Foundation框架中定义的一个用于字符输出的函数。NSLog不是Objective-C语言自身的一部分,但是,这里介绍它,是因为它用于本书中的很多示例和练习中。
NSLog类似于printf,但是有如下一些区别:
NSLog写入控制台日志,也写入一个终端窗口。控制台日志是操作系统负责维护的一个消息日志。在OS X上,可以使用Console应用程序(/Applications/Utilities/ Console.app)来查看控制台日志。
NSLog的格式字符串是一个NSString直接量,而不是一个C字符串直接量。
NSLog在打印后自动换到一个新行。不需要在格式字符串末尾添加一个额外的\n。
NSLog使用一个额外的转换修饰符,%@,它接受一个Objective-C对象作为其参数。在转换中,NSLog调用参数对象的description方法。该description方法返回一个NSString,用以描述该对象。返回的NSString替代了输出中的%@,如下面的例子所示:
NSString *aString = @"Hello New York!"; NSLog( @"The object description is: %@", aString );
NSString的描述只是字符串本身。执行以上代码,将会产生如下的输出:
The object description is: Hello New York!
当创建自己的类时,可以覆盖description方法为自己的类提供定制的描述。
注意 如果使用带有%@描述符的格式字符串,但是,忘记了提供一个对应的对象参数,那么NSLog将尝试向位于对象参数所应该放置的地址的字节发送一条description消息。这通常会导致程序崩溃。
在一个发布的程序中,不应该使用NSLog语句(这么做会在客户的控制台日志中产生杂乱信息),但是,对于在学习和调试过程的简单输出来说,它很有用。
NSLog有一项功能可能很恼人,它在你要求其输出的内容前面加了一个长长的字符串信息,其中包括执行该语句的时间和日期(详细到毫秒)、可执行程序的名称,以及执行它的程序的进程id。如下的NSLog语句:
NSLog( @"Greetings from NSLog" );
将产生如下的输出:
2010-02-01 11:41:26.556 a.out[33955:903] Greetings from NSLog
为了显示上的清晰,在本书后面的部分中,在显示NSLog的输出时,我们去除了额外的信息。
转自: http://book.51cto.com/art/201102/245615.htm