ObjectiveCBeginning.docx
- 文档编号:6251686
- 上传时间:2023-05-09
- 格式:DOCX
- 页数:60
- 大小:36.51KB
ObjectiveCBeginning.docx
《ObjectiveCBeginning.docx》由会员分享,可在线阅读,更多相关《ObjectiveCBeginning.docx(60页珍藏版)》请在冰点文库上搜索。
ObjectiveCBeginning
Translations:
English|Chinese|Korean
大綱
∙開始吧
o下載這篇教學
o設定環境
o前言
o編譯helloworld
∙創建Classes
o@interface
o@implementation
o把它們湊在一起
∙詳細說明...
o多重參數
o建構子(Constructors)
o存取權限
oClasslevelaccess
o異常情況(Exceptions)處理
∙繼承、多型(Inheritance,Polymorphism)以及其他物件導向功能
oid型別
o繼承(Inheritance)
o動態識別(Dynamictypes)
oCategories
oPosing
oProtocols
∙記憶體管理
oRetainandRelease(保留與釋放)
oDealloc
oAutoreleasePool
∙FoundationFrameworkClasses
oNSArray
oNSDictionary
∙優點與缺點
∙更多資訊
∙開始吧
o下載這篇教學
▪所有這篇初學者指南的原始碼都可以由objc.tar.gz下載。
這篇教學中的許多範例都是由SteveKochan在ProgramminginObjective-C
.一書中撰寫。
如果你想得到更多詳細資訊及範例,請直接參考該書。
這個網站上登載的所有範例皆經過他的允許,所以請勿複製轉載。
o設定環境
▪Linux/FreeBSD:
安裝GNUStep
▪為了編譯GNUstep應用程式,必須先執行位於/usr/GNUstep/System/Makefiles/GNUstep.sh的GNUstep.sh這個檔案。
這個路徑取決於你的系統環境,有些是在/usr,some/usr/lib,有些是/usr/local。
如果你的shell是以csh/tcsh為基礎的shell,則應該改用GNUStep.csh。
建議把這個指令放在.bashrc或.cshrc中。
▪MacOSX:
安裝XCode
▪WindowsNT5.X:
安裝cygwin或mingw,然後安裝GNUStep
o前言
▪這篇教學假設你已經有一些基本的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中,呼叫物件上的一個訊息並不一定表示物件真的會實作這個訊息,而是物件知道如何以某種方式去實作它,或是轉送給知道如何實作的物件。
o編譯helloworld
▪hello.m
▪#import
▪
▪intmain(intargc,constchar*argv[]){
▪printf("helloworld\n");
▪return0;
}
▪輸出
helloworld
▪在Objective-C中使用#import代替#include
▪Objective-C的預設副檔名是.m
∙創建classes
o@interface
▪基於"ProgramminginObjective-C,"Copyright©2004bySamsPublishing一書中的範例,並經過允許而刊載。
▪Fraction.h
▪#import
▪
▪@interfaceFraction:
NSObject{
▪intnumerator;
▪intdenominator;
▪}
▪
▪-(void)print;
▪-(void)setNumerator:
(int)n;
▪-(void)setDenominator:
(int)d;
▪-(int)numerator;
▪-(int)denominator;
▪@end
▪NSObject:
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作為結束。
o@implementation
▪基於"ProgramminginObjective-C,"Copyright©2004bySamsPublishing一書中的範例,並經過允許而刊載。
▪Fraction.m
▪#import"Fraction.h"
▪#import
▪
▪@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;
▪}
@end
▪Implementation以@implementationClassName開始,以@end結束。
▪Implement定義好的methods的方式,跟在interface中宣告時很近似。
o把它們湊在一起
▪基於"ProgramminginObjective-C,"Copyright©2004bySamsPublishing一書中的範例,並經過允許而刊載。
▪main.m
▪#import
▪#import"Fraction.h"
▪
▪intmain(intargc,constchar*argv[]){
▪//createanewinstance
▪Fraction*frac=[[Fractionalloc]init];
▪
▪//setthevalues
▪[fracsetNumerator:
1];
▪[fracsetDenominator:
3];
▪
▪//printit
▪printf("Thefractionis:
");
▪[fracprint];
▪printf("\n");
▪
▪//freememory
▪[fracrelease];
▪
▪return0;
}
▪output
Thefractionis:
1/3
▪Fraction*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在之後會有詳盡的解說。
∙詳細說明...
o多重參數
▪目前為止我還沒展示如何傳遞多個參數。
這個語法乍看之下不是很直覺,不過它卻是來自一個十分受歡迎的Smalltalk版本。
▪基於"ProgramminginObjective-C,"Copyright©2004bySamsPublishing一書中的範例,並經過允許而刊載。
▪Fraction.h
▪...
▪-(void)setNumerator:
(int)nandDenominator:
(int)d;
...
▪Fraction.m
▪...
▪-(void)setNumerator:
(int)nandDenominator:
(int)d{
▪numerator=n;
▪denominator=d;
▪}
...
▪main.m
▪#import
▪#import"Fraction.h"
▪
▪intmain(intargc,constchar*argv[]){
▪//createanewinstance
▪Fraction*frac=[[Fractionalloc]init];
▪Fraction*frac2=[[Fractionalloc]init];
▪
▪//setthevalues
▪[fracsetNumerator:
1];
▪[fracsetDenominator:
3];
▪
▪//combinedset
▪[frac2setNumerator:
1andDenominator:
5];
▪
▪//printit
▪printf("Thefractionis:
");
▪[fracprint];
▪printf("\n");
▪
▪//printit
▪printf("Fraction2is:
");
▪[frac2print];
▪printf("\n");
▪
▪//freememory
▪[fracrelease];
▪[frac2release];
▪
▪return0;
}
▪output
▪Thefractionis:
1/3
Fraction2is:
1/5
▪這個method實際上叫做setNumerator:
andDenominator:
▪加入其他參數的方法就跟加入第二個時一樣,即method:
label1:
label2:
label3:
,而呼叫的方法是[objmethod:
param1label1:
param2label2:
param3label3:
param4]
▪Labels是非必要的,所以可以有一個像這樣的method:
method:
:
:
,簡單的省略label名稱,但以:
區隔參數。
並不建議這樣使用。
o建構子(Constructors)
▪基於"ProgramminginObjective-C,"Copyright©2004bySamsPublishing一書中的範例,並經過允許而刊載。
▪Fraction.h
▪...
▪-(Fraction*)initWithNumerator:
(int)ndenominator:
(int)d;
...
▪Fraction.m
▪...
▪-(Fraction*)initWithNumerator:
(int)ndenominator:
(int)d{
▪self=[superinit];
▪
▪if(self){
▪[selfsetNumerator:
nandDenominator:
d];
▪}
▪
▪returnself;
▪}
...
▪main.m
▪#import
▪#import"Fraction.h"
▪
▪intmain(intargc,constchar*argv[]){
▪//createanewinstance
▪Fraction*frac=[[Fractionalloc]init];
▪Fraction*frac2=[[Fractionalloc]init];
▪Fraction*frac3=[[Fractionalloc]initWithNumerator:
3denominator:
10];
▪
▪//setthevalues
▪[fracsetNumerator:
1];
▪[fracsetDenominator:
3];
▪
▪//combinedset
▪[frac2setNumerator:
1andDenominator:
5];
▪
▪//printit
▪printf("Thefractionis:
");
▪[fracprint];
▪printf("\n");
▪
▪printf("Fraction2is:
");
▪[frac2print];
▪printf("\n");
▪
▪printf("Fraction3is:
");
▪[frac3print];
▪printf("\n");
▪
▪//freememory
▪[fracrelease];
▪[frac2release];
▪[frac3release];
▪
▪return0;
}
▪output
▪Thefractionis:
1/3
▪Fraction2is:
1/5
Fraction3is:
3/10
▪@interface裡的宣告就如同正常的函式。
▪@implementation使用了一個新的關鍵字:
super
▪如同Java,Objective-C只有一個parentclass(父類別)。
▪使用[superinit]來存取Superconstructor,這個動作需要適當的繼承設計。
▪你將這個動作回傳的instance指派給另一新個關鍵字:
self。
Self很像C++與Java的this指標。
▪if(self)跟(self!
=nil)一樣,是為了確定superconstructor成功傳回了一個新物件。
nil是Objective-C用來表達C/C++中NULL的方式,可以引入NSObject來取得。
▪當你初始化變數以後,你用傳回self的方式來傳回自己的位址。
▪預設的建構子是-(id)init。
▪技術上來說,Objective-C中的建構子就是一個"init"method,而不像C++與Java有特殊的結構。
o存取權限
▪預設的權限是@protected
▪Java實作的方式是在methods與變數前面加上public/private/protected修飾語,而Objective-C的作法則更像C++對於instancevariable(譯注:
C++術語一般稱為datamembers)的方式。
▪Access.h
▪#import
▪
▪@interfaceAccess:
NSObject{
▪@public
▪intpublicVar;
▪@private
▪intprivateVar;
▪intprivateVar2;
▪@protected
▪intprotectedVar;
▪}
@end
▪Access.m
▪#import"Access.h"
▪
▪@implementationAccess
@end
▪main.m
▪#import"Access.h"
▪#import
▪
▪intmain(intargc,constchar*argv[]){
▪Access*a=[[Accessalloc]init];
▪
▪//works
▪a->publicVar=5;
▪printf("publicvar:
%i\n",a->publicVar);
▪
▪//doesn'tcompile
▪//a->privateVar=10;
▪//printf("privatevar:
%i\n",a->privateVar);
▪
▪[arelease];
▪return0;
}
▪output
publicvar:
5
▪如同你所看到的,就像C++中private:
[listofvars]public:
[listofvars]的格式,它只是改成了@private,@protected,等等。
oClasslevelaccess
▪當你想計算一個物件被instance幾次時,通常有classlevelvariables以及classlevelfunctions是件方便的事。
▪ClassA.h
▪#import
▪
▪staticintcount;
▪
▪@interfaceClassA:
NSObject
▪+(int)initCount;
▪+(void)initialize;
@end
▪ClassA.m
▪#import"ClassA.h"
▪
▪@implementationClassA
▪-(id)init{
▪self=[superinit];
▪count++;
▪returnself;
▪}
▪
▪+(int)initCount{
▪returncount;
▪}
▪
▪+(void)initialize{
▪count=0;
▪}
@end
▪main.m
▪#import"ClassA.h"
▪#import
▪
▪intmain(intargc,constchar*argv[]){
▪ClassA*c1=[[ClassAalloc]init];
▪ClassA*c2=[[ClassAalloc]init];
▪
▪//printcount
▪printf("ClassAc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ObjectiveC Beginning