了解Objective-C特點(diǎn)及特征
了解Objective-C特點(diǎn)及特征是本文要介紹的內(nèi)容,目前好象只有Apple使用Objective-C作為其支持的語言吧。 不多說,直接來看詳細(xì)內(nèi)容,與C++的不同之處有:
Objective-C中所有的類都必須繼承自NSObject。
Objective-C中所有對(duì)象都是指針的形式。
Objective-C用self代替this。
Objective-C使用id代替void*。
Objective-C使用nil表示NULL
Objective-Ck只支持單繼承。
Objective-C使用YES/NO表示TRUE/FALSE
Objective-C使用#import代替#include
Objective-C中用消息表示類的方法,并采用[aInstance method:argv]調(diào)用形式。
Objective-C支持反射機(jī)制
Objective-C支持Dynamic Typing, Dynamic Binding和Dynamic Loading。
與C++的相同之處有:
與C共享的部分一致。
可以使用assert(BOOL), 一般用NSCParameterAssert(BOOL)代替。
Objective-C中的命名前綴說明:
- NS-:NextStep
- CF-:Core Foundation
- CA-:Core Animation
- CG-:Core Graphics
- UI-:User Interface
Objective-C中的消息特殊性:
調(diào)用消息的類可以不知道如何響應(yīng)這個(gè)消息。如果它不知道如何處理這個(gè)消息,它會(huì)自動(dòng)的將這個(gè)消息轉(zhuǎn)給其他的類,比如它的父類。
調(diào)用消息的類可以是nil。在C++中,在使用類方法之前,我們都需要檢查對(duì)象是否為空,所以在實(shí)現(xiàn)析構(gòu)函數(shù)的時(shí)候,常會(huì)有如下的代碼,如if (var) { delete var; } 但是在Objective-C中,我們就可以直接寫[var release]; 即使var == nil, 也不會(huì)有問題。
Objective-C中的函數(shù)聲明格式有:
- -/+ (return type) function_name;
- -/+ (return type) function_name : (parameter type) parameter;
- -/+ (return type) function_name :
- (parameter type) parameter1 otherParameter :
- (parameter_type) parameter2
以上參數(shù)說明:-表示一般函數(shù),+表示靜態(tài)函數(shù)。otherParameter是參數(shù)的別名(***個(gè)參數(shù)的別名省略),在函數(shù)調(diào)用時(shí)方便指定。
Objective-C中的構(gòu)造/析構(gòu)函數(shù)
Objective-C中的init()/release()對(duì)應(yīng)于C++的構(gòu)造/析構(gòu)函數(shù)。alloc()/dealloc()也就對(duì)應(yīng)于C++的new和delete,其中的dealloc()由于引用計(jì)數(shù)的自動(dòng)調(diào)用而不用手動(dòng)調(diào)用。
Objective-C中父類的init()/release()函數(shù)需要子類的手動(dòng)調(diào)用。而且每次都必須調(diào)用。不同于C++的自動(dòng)調(diào)用。
構(gòu)造函數(shù)(- (id) init)調(diào)用形如:CSample* pSample=[CSample alloc] init];其中alloc(+ (id) alloc)是繼承來的static函數(shù),init是繼承來的一般函數(shù),如重寫一般函數(shù)時(shí),則相當(dāng)于C++的覆蓋(不帶參數(shù))或重載(帶參數(shù))。
析構(gòu)函數(shù)(- (void) release)將引用計(jì)數(shù)減1,當(dāng)=0時(shí)父類的release()會(huì)自動(dòng)調(diào)用dealloc(- (void) dealloc);
當(dāng)Objective-C沒有數(shù)據(jù)成員時(shí),可省略{},建議保留。
繼承下來的方法,如:-(id) init可以頭文件中省略,建議保留
0-C中只有數(shù)據(jù)成員的訪問限制,沒有方法的訪問限制。
同C++一樣,數(shù)據(jù)成員有三種訪問限制public, protected, private,缺省是protected。
示例:
- @interface AccessExample: NSObject {
- @public
- int publicVar;
- @protected
- int protectedVar;
- @private
- int privateVar;
- }
- @end
方法的訪問限制可通過Category實(shí)現(xiàn)
示例:
- @interface MyClass
- - (void) sayHello {
- NSLog(@"Hello");
- }
- @end
- @interface MyClass(Private)
- - (void) kissGoodbye;
- @end
Objective-C中沒有類的靜態(tài)變量,只有全局變量
Objective-C中的數(shù)組NSArray可以保存不同類型的數(shù)據(jù)。
Objective-C也支持run-time時(shí)的類類型檢查
- - (BOOL) isKindOfClass: classObj
用于判斷該對(duì)象是否屬于某個(gè)類或者它的子類
- - (BOOL) isMemberOfClass: classObj
用于判斷該對(duì)象是否屬于某個(gè)類(這里不包括子類)
- - (BOOL) respondsToSelector: selector
用于判斷該對(duì)象是否能響應(yīng)某個(gè)消息。這里,我們可以將@selector后面帶的參數(shù)理解為C++中的函數(shù)指針。
注意:
1)不要忘了@
2)@selector后面用的是(),而不是[]。
3)要在消息名稱后面跟:,無論這個(gè)消息是否帶參數(shù)。如:
- [pSquare respondsToSelector:@selector(Set: andHeight:)]。
- + (BOOL) instancesRespondToSelector: selector
用于判斷該類是否能響應(yīng)某個(gè)消息。這是一個(gè)靜態(tài)函數(shù)。
-(id) performSelector: selector :調(diào)用對(duì)象的selector方法。
conformsToProtocol 類似于respondsToSelector ,用于動(dòng)態(tài)檢查某個(gè)對(duì)象是否遵守某個(gè)協(xié)議。
Category:在沒有源代碼的情況下,為一個(gè)已經(jīng)存在的類添加一些新的功能
只能添加新的方法,不能添加新的數(shù)據(jù)成員
Category 的名字必須是***的
Protocol:相當(dāng)于C++中的純虛類
形如:
- @interface MyDate: NSObject <Printing> { } @end
使用:
- MyDate * dat = [[MyDate alloc] init]; id<Printing> var = dat; [var print]。
說明:我們首先聲明了Printing 協(xié)議,任何遵守這個(gè)協(xié)議的類,都必須實(shí)現(xiàn)print 方法。在Objective-C 中,我們通過<>來表示遵守某個(gè)協(xié)議。當(dāng)某個(gè)類聲明要遵守某個(gè)協(xié)議之后,它就必須在.m文件中實(shí)現(xiàn)這個(gè)協(xié)議中的所有方法。使用id<Printing> 作為類型,而不是象C++中的Printing* var。
IBOutlet, IBAction: 這兩個(gè)東西其實(shí)在語法中沒有太大的作用。如果你希望在Interface Builder中能看到這個(gè)控件對(duì)象,那么在定義的時(shí)候前面加上IBOutlet,在IB里就能看到這個(gè)對(duì)象的outlet,如果你希望在Interface Builder里控制某個(gè)對(duì)象執(zhí)行某些動(dòng)作,就在方法前面加上(IBAction)。
盡量避免在一行語句中進(jìn)行兩層以上的嵌套
消息轉(zhuǎn)發(fā):
- - (void) forwardInvocation: (NSInvocation*)anInvocation;
小結(jié):了解Objective-C特點(diǎn)及特征的內(nèi)容介紹完了,希望本文對(duì)你有所幫助!