Objective-C學習中對 C語言的擴展
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語言的擴展的內容介紹完了,希望本文對你有所幫助!