Object C 入門基礎


      一、Objective-C與C的淵源 

      Objective-C誕生於 20 世紀 80 年代,由Brad Cox 發明,意在將流行的、可移植的 C 語言與優雅的 Smalltalk 語言結合在一起。Objective-C 是 C 語言的一個擴展集,它以 C 語言爲基礎,在語言中添加了一些微妙但意義重大的特性。 

      蘋果公司的iphone平臺採用Objective-C做爲native language的開發,Objective-C的內核是C語言的,並基於C語言實現OOP的一些特性。Objective-C是對C語言的擴展,這和C++的前身Better-c有很大的相似之處,Objective-C的新版本里實現了和Java類似的垃圾回收機制,但基於iphone平臺的資源限制,iphone平臺並不支持垃圾回收機制。 



二、初識Objective-C 

      1、Cocoa的組成 

      蘋果公司將Cocoa、Carbon、QuickTime和OpenGL等技術作爲框架集提供Cocoa組成部分有:(1)Foundation框架(有很多有用的,面向數據的低級類和數據結構);(2)Application Kit(也稱AppKit)框架(包含了所有的用戶接口對象和高級類,例如NS……),還有一個支持框架的套件,包括Core Animation和Core Image。 

     2、NSLog相當於printf() 

     NSLog(@"hello Objective-C"); 

    //注:@是Objective-C在標準C語言基礎上添加的特徵之一,雙引號的字符串前面有一個@,這表示引用的字符串應該作爲Cocoa的NSString元素處理 

    NSLog(@"are %d and %d different? %@",5,5,boolString(areTheyDifferent)); 

    //注意%@:使用NSLog輸出任何對象值時,都會使用這個格式說明 

    3、BOOL使用8位存儲,YES定義爲1,NO定義爲0,大於1不爲YES,跟標準C不同。 

    若不小心將一個長於1字節的整型值賦給BOOL,則只截取低八位 

    Obejective-C中1不等於1,絕對不要將BOOL值和YES比較 



三、怪異的Objective-C語法結構 

   我這裏之所以說它的怪異,是相對於習慣其它編程語言(JAVA,C++等語言),下面把它最常見的特色簡單說明: 

   1、減號(或者加號) 

   我們每天都會在IOS開發中見到在方法名前“+”或“─”號,那麼這些是什麼,怎麼這麼奇怪? 

首先要把以前學習面嚮對象語言的慣性思維拋去,在Objective-C裏面沒有public和private的概念,你可以認爲全是public;它只有類方法和實例方法,加號表示類方法,類方法可以直接調用,而不用創建這個類的實例;減號表示實例方法,需要創建這個類的實例對象纔可以調用。 



比如c#/java中,一個方法的寫法可能是: 

private void hello(bool ishello) 



//OOXX 





用Objective-C寫出來就是 

-(void) hello:(BOOL)ishello 



//OOXX 



    有過編程經驗的人,理解這些應該不難! 



    2、中括號 

    中括號可以認爲是如何調用你剛纔寫的這個方法,通常在Objective-C裏說“消息”。 

比如C#裏你可以這麼寫: 

this.hello(true); 



在Objective-C裏,就要寫成: 

[self hello:YES]; 







   3、NS**** 

   在IOS開發中,經常會遇到NS開頭的對象,這個要從喬幫主歷史恩怨說起。當年Steve Jobs 和John Scullery與恩怨,喬幫主當年被人擠兌出蘋果,自立門戶的時候做了個公司叫做NextStep,裏面這一整套開發包很是讓一些科學家們喜歡,而現在Mac OS用的就是NextStep這一套函數庫。 

   這些開發NextStep的人們比較自戀地把函數庫裏面所有的類都用NextStep的縮寫打頭命名,也就是NS****了。比較常見的比如: 



NSLog 

NSString 

NSInteger 

NSURL 

NSImage 

… 

   你會經常看到一些教學裏面會用到: 

NSLog (@"%d",myInt); 

   這句話主要是在console裏面跟蹤使用,你會在console裏面看到myInt的值(在XCode裏面運行的時候打開dbg窗口即可看到)。 

你還可以看到其他名字打頭的一些類,比如CF、CA、CG、UI等等,比如 

CFStringTokenizer 這是個分詞的東東 

CALayer 這表示Core Animation的層 

CGPoint 這表示一個點 

UIImage 這表示iPhone裏面的圖片 



CF說的是Core Foundation,CA說的是Core Animation,CG說的是Core Graphics,UI說的是iPhone的User Interface……還有很多別的,等你自己去發掘了。 



四、Objective-C常見語法說明 





   1 頭文件引用使用 #import “文件名”或者 #import <文件名>的形式以確保每個頭文件僅被包含一次; 



   2 類聲明以 @interface 類名:繼承類 開頭,以 @end 結尾,類實現以@implementation 類名 開頭,以 @end 結尾; 

   3 實例方法,即成員方法,在方法名前面添加一個減號(-);類方法,在方法名前面添加一個加號(+); 

   4 類方法的調用格式爲 [類名 類方法],成員方法調用格式爲 [實例名 實例方 法],這種模式在ObjC中被稱爲消息機制,[對象 消息]即給對象發送了一個消息,產生的 效果就是該對象調用了該類中定義的對應的實例方法; 

   5 下面以一個簡單的例子來說明上述語法: 



Print類.h文件(聲明文件) 





#import <Foundation/Foundation.h> 



@interface Print : NSObject { //Objective-c的所有類都繼承於NSObject 

    // 成員屬性 

    NSString *caption; 

    NSString *photographer; 



//在Objective-C 2.0引入了屬性合成,相當於之前的get/set方法 

@property (nonatomic, copy) NSString *caption; 

@property (nonatomic, copy) NSString *photographer; 



// 類方法 

+ (NSString*)printName; 

@end 







Print類.m文件(實現文件) 



#import "Print.h" 



@implementation Print 

@synthesize photographer; 

@synthesize caption; 



// 類方法 

+ (NSString*)printName 



    return (@"Print Result"); 





@end 







Print 類使用 




#import "Print.h" 



int main(int argc, const char *argv[]) 



    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    return NSApplicationMain(argc, (const char **)argv); 

    // 類方法調用 

    NSLog(@"ClassName = /"%@/"", [Print printName]); 



    // 初始化 

    Print* p = [[Print alloc] init]; 

    // 設置器調用 

    [p setCaption:@"MyCaption"]; 

    [p setPhotographer:@"MyPhotographer"]; 



    // 獲取器調用 

    NSLog(@"Caption = /"%@/"", [p caption]); 

    NSLog(@"Photographer = /"%@/"", [p photographer]); 

    [pool drain]; 



    return 0; 









運行這段代碼,結果如下: 



2011-05-31 11:12:13.715 demo[1471:903] ClassName = "Print Result" 

2011-05-31 11:12:13.718 demo[1471:903] Caption = "MyCaption" 

2011-05-31 11:12:13.718 demo[1471:903] Photographer = "MyPhotographer
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章