Translations:English|Chinese大綱大綱大綱大綱開始吧下載這篇教學設定環境前言編譯helloworld創建Classes@interface@implementation把它們湊在一起詳細說明...多重參數建構子(Constructors)存取權限Classlevelaccess異常情況(Exceptions)處理繼承、多型(Inheritance,Polymorphism)以及其他物件導向功能id型別繼承(Inheritance)動態識別(Dynamictypes)CategoriesPosingProtocols記憶體管理RetainandRelease(保留與釋放)DeallocAutoreleasePoolFoundationFrameworkClassesNSArrayNSDictionary優點與缺點更多資訊開始吧開始吧開始吧開始吧下載這篇教學下載這篇教學下載這篇教學下載這篇教學所有這篇初學者指南的原始碼都可以由objc.tar.gz下載。這篇教學中的許多範例都是由SteveKochan在ProgramminginObjective-C.一書中撰寫。如果你想得到更多詳細資訊及範例,請直接參考該書。這個網站上登載的所有範例皆經過他的允許,所以請勿複製轉載。設定環境設定環境設定環境設定環境Linux/FreeBSD:安裝GNUStep為了編譯GNUstep應用程式,必須先執行位於/usr/GNUstep/System/Makefiles/GNUstep.sh的GNUstep.sh這個檔案。這個路徑取決於你的系統環境,有些是在/usr,some/usr/lib,有些是2011-3-10Objective-CBeginner'sGuideD:/…/Objective-CBeginner'sGui…1/34/usr/local。如果你的shell是以csh/tcsh為基礎的shell,則應該改用GNUStep.csh。建議把這個指令放在.bashrc或.cshrc中。MacOSX:安裝XCodeWindowsNT5.X:安裝cygwin或mingw,然後安裝GNUStep前言前言前言前言這篇教學假設你已經有一些基本的C語言知識,包括C資料型別、什麼是函式、什麼是回傳值、關於指標的知識以及基本的C語言記憶體管理。如果您沒有這些背景知識,我非常建議你讀一讀K&R的書:TheCProgrammingLanguage(譯注:台灣出版書名為C程式語言第二版)這是C語言的設計者所寫的書。Objective-C,是C的衍生語言,繼承了所有C語言的特性。是有一些例外,但是它們不是繼承於C的語言特性本身。nil:在C/C++你或許曾使用過NULL,而在Objective-C中則是nil。不同之處是你可以傳遞訊息給nil(例如[nilmessage];),這是完全合法的,然而你卻不能對NULL如法炮製。BOOL:C沒有正式的布林型別,而在Objective-C中也不是「真的」有。它是包含在Foundationclasses(基本類別庫)中(即importNSObject.h;nil也是包括在這個標頭檔內)。BOOL在Objective-C中有兩種型態:YES或NO,而不是TRUE或FALSE。#importvs#include:就如同你在helloworld範例中看到的,我們使用了#import。#import由gcc編譯器支援。我並不建議使用#include,#import基本上跟.h檔頭尾的#ifndef#define#endif相同。許多程式員們都同意,使用這些東西這是十分愚蠢的。無論如何,使用#import就對了。這樣不但可以避免麻煩,而且萬一有一天gcc把它拿掉了,將會有足夠的Objective-C程式員可以堅持保留它或是將它放回來。偷偷告訴你,Apple在它們官方的程式碼中也使用了#import。所以萬一有一天這種事真的發生,不難預料Apple將會提供一個支援#import的gcc分支版本。在Objective-C中,method及message這兩個字是可以互換的。不過messages擁有特別的特性,一個message可以動態的轉送給另一個物件。在Objective-C中,呼叫物件上的一個訊息並不一定表示物件真的會實作這個訊息,而是物件知道如何以某種方式去實作它,或是轉送給知道如何實作的物件。編譯helloworld編譯helloworld編譯helloworld編譯helloworldhello.m#importstdio.hintmain(intargc,constchar*argv[]){printf(helloworld\n);return0;}輸出helloworld在Objective-C中使用#import代替#includeObjective-C的預設副檔名是.m創建classes創建classes創建classes創建classes2011-3-10Objective-CBeginner'sGuideD:/…/Objective-CBeginner'sGui…2/34@interface@interface@interface@interface基於ProgramminginObjective-C,Copyrightc2004bySamsPublishing一書中的範例,並經過允許而刊載。Fraction.h#importFoundation/NSObject.h@interfaceFraction:NSObject{intnumerator;intdenominator;}-(void)print;-(void)setNumerator:(int)n;-(void)setDenominator:(int)d;-(int)numerator;-(int)denominator;@endNSObject:NeXTStepObject的縮寫。因為它已經改名為OpenStep,所以這在今天已經不是那麼有意義了。繼承(inheritance)以Class:Parent表示,就像上面的Fraction:NSObject。夾在@interfaceClass:Parent{....}中的稱為instancevariables。沒有設定存取權限(protected,public,private)時,預設的存取權限為protected。設定權限的方式將在稍後說明。Instancemethods跟在成員變數(即instancevariables)後。格式為:scope(returnType)methodName:(parameter1Type)parameter1Name;scope有class或instance兩種。instancemethods以----開頭,classlevelmethods以++++開頭。Interface以一個@end作為結束。@implementation@implementation@implementation@implementation基於ProgramminginObjective-C,Copyrightc2004bySamsPublishing一書中的範例,並經過允許而刊載。Fraction.m#importFraction.h#importstdio.h@implementationFraction-(void)print{printf(%i/%i,numerator,denominator);}-(void)setNumerator:(int)n{numerator=n;}-(void)setDenominator:(int)d{denominator=d;}-(int)denominator{returndenominator;}-(int)numerator{returnnumerator;2011-3-10Objective-CBeginner'sGuideD:/…/Objective-CBeginner'sGui…3/34}@endImplementation以@implementationClassName開始,以@end結束。Implement定義好的methods的方式,跟在interface中宣告時很近似。把它們湊在一起把它們湊在一起把它們湊在一起把它們湊在一起基於ProgramminginObjective-C,Copyrightc2004bySamsPublishing一書中的範例,並經過允許而刊載。main.m#importstdio.h#importFraction.hintmain(intargc,constchar*argv[]){//createanewinstanceFraction*frac=[[Fractionalloc]init];//setthevalues[fracsetNumerator:1];[fracsetDenominator:3];//printitprintf(Thefractionis:);[fracprint];printf(\n);//freememory[fracrelease];return0;}outputThefractionis:1/3Fraction*frac=[[Fractionalloc]init];這行程式碼中有很多重要的東西。在Objective-C中呼叫methods的方法是[objectmethod],就像C++的object-method()。Objective-C沒有value型別。所以沒有像C++的Fractionfrac;frac.print();這類的東西。在Objective-C中完全使用指標來處理物件。這行程式碼實際上做了兩件事:[Fractionalloc]呼叫了Fractionclass的allocmethod。這就像malloc記憶體,這個動作也做了一樣的事情。[objectinit]是一個建構子(constructor)呼叫,負責初始化物件中的所有變數。它呼叫了[Fractionalloc]傳回的instance上的initmethod。這個動作非常普遍,所以通常以一行程式完成:Object*var=[[Objectalloc]init];[fracsetNumerator:1]非常簡單。它呼叫了frac上的setNumeratormethod並傳入1為參數。如同每個C的變體,Objective-C也有一個用以釋放記憶體的方式:release。它繼承自NSObject,這個method在之後會有詳盡的解說。詳細說明...詳細說明...詳細說明...詳細說明...2011-3-10Objective-CBeginner'sGuideD:/…/Objective-CBeginner'sGui…4/34多重參數多重參數多重參數多重參數目前為止我還沒展示如何傳遞多個參數。這個語法乍看之下不是很直覺,不過它卻是來自一個十分受歡迎的Smalltalk版本。基於ProgramminginObjective-C,Copyrightc2004bySamsPublishing一書中的範例,並經過允許而刊載。Fraction.h...-(void)setNumerator:(int)nandDenominator:(int)d;...Fraction.m...-(void)setNumerator:(int)nandDenominator:(int)d{numerator=n;denominator=d;}...main.m#importstdio.h#importFraction.hintmain(intargc,constchar*argv[]){//createanewinstanceFraction*frac=[[Fractionalloc]init];Fraction*frac2=[[Fractionalloc]init];//set