object-c通常寫作objective-c或者obj-c,是根據(jù)C語言所衍生出來的語言,繼承了C語言的特性,是擴(kuò)充C的面向?qū)ο缶幊陶Z言。它主要使用于Mac OS X和GNUstep這兩個使用OpenStep標(biāo)準(zhǔn)的系統(tǒng),而在NeXTSTEP和OpenStep中它更是基本語言。Objective-C可以在gcc運(yùn)作的系統(tǒng)寫和編譯,因?yàn)間cc含Objective-C的編譯器。在MAC OSX系統(tǒng)下,運(yùn)用蘋果提供的SDK等開發(fā)工具包,可以用來做IOS開發(fā),開發(fā)后的程序在Iphone虛擬機(jī)中進(jìn)行測試,運(yùn)用的主要語言為Object-c。與C#類似。Object-c僅支持單一父類繼承,不支持多重繼承。
object c_object-c -發(fā)展歷史
二十世紀(jì)80年代初布萊德?確斯(Brad Cox)在其公司Stepstone發(fā)明Objective-C。他對軟件設(shè)計(jì)和編程里的真實(shí)可用度問題十分關(guān)心。 Objective-C最主要的描述是他1986年出版的Object Oriented Programming: An Evolutionary Approach. Addison Wesley. ISBN 0-201-54834-8.
object c_object-c -優(yōu)點(diǎn)及缺點(diǎn)
Objective-C是非?!皩?shí)際”的語言。它使用一個用C寫成、很小的運(yùn)行庫,只會令應(yīng)用程序的大小增加很小,和大部分OO系統(tǒng)使用極大的VM執(zhí)行時間會取代了整個系統(tǒng)的運(yùn)作相反,ObjC寫成的程序通常不會比其原始碼大很多。而其函式庫(通常沒附在軟件發(fā)行本)亦和Smalltalk系統(tǒng)要使用極大的內(nèi)存來開啟一個窗口的情況相反。Objective-C的最初版本并不支持垃圾回收。在當(dāng)時這是爭論的焦點(diǎn)之一,很多人考慮到Smalltalk回收時有漫長的“死亡時間”,令整個系統(tǒng)失去功用。Objective-C為避免此問題才不擁有這個功能。雖然某些第三方版本已加入這個功能(尤是GNUstep),Apple在其Mac OS X 10.3中仍未引入這個功能。另一個問題是ObjC不包括命名空間機(jī)制(namespace mechanism)。取而代之的是程序設(shè)計(jì)師必須在其類別名稱加上前綴,時常引致沖突。在2004年,在Cocoa編程環(huán)境中,所有Mac OS X類別和函式均有“NS”作為前綴,例如NSObject或NSButton來清楚分辨它們屬于Mac OS X核心;使用“NS”是由于這些類別的名稱在NeXTSTEP開發(fā)時定下。雖然Objective-C是C的母集,但它也不視C的基本型別為第一級的對象。和C++不同,Objective-C不支援運(yùn)算子多載(它不支持ad-hoc多型)。亦與C++不同,但和Java相同,Objective-C只容許對象繼承一個類別(不設(shè)多重繼承)。Categories和protocols不但可以提供很多多重繼承的好處,而且沒有很多缺點(diǎn),例如額外執(zhí)行時間過重和二進(jìn)制不兼容。
object c_object-c -和C++的比較
單一繼承:Objective-C不支持多重繼承,(同Java和Smalltalk),而C++語言支持多重繼承。動態(tài):Objective-C是動態(tài)定型(dynamicaly typed)所以它的類庫比C++要容易操作。Objective-C 在運(yùn)行時可以允許根據(jù)字符串名字來訪問方法和類,還可以動態(tài)連接和添加類。C++ 跟從面向?qū)ο缶幊汤锏腟imula 67(一種早期OO語言)學(xué)派,而Objecive-C屬于Smalltalk學(xué)派。在C++里,對象的靜態(tài)類型決定你是否可以發(fā)送消息給它,而對Objecive-C來說,由動態(tài)類型來決定。Simula 67學(xué)派更安全,因?yàn)榇蟛糠皱e誤可以在編譯時查出。 而Smalltalk學(xué)派更靈活,比如一些Smalltalk 看來無誤的程序拿到Simualr 67那里就無法通過。從很多方面來看,C++和Objective-C的差別,與其說是技術(shù)上的, 不如說是思維方式上的。
object c_object-c -擴(kuò)展的關(guān)鍵字
@interface
類型聲明,類似于c++中的class,區(qū)別在于Object c中的聲明與實(shí)現(xiàn)是強(qiáng)制分開的,@interface關(guān)鍵字用于類型的聲明,包括數(shù)據(jù)成員、方法聲明、屬性等。方法的參數(shù)傳遞采用中綴符的形式,利用“:”分割參數(shù)名和被傳遞參數(shù),類型的聲明以@interface開頭,以@end結(jié)束,通常一個類型的聲明采用下面的結(jié)構(gòu):
@class someOtherObject //外部類型聲明
someObject:NSObject //繼承的類型
{
int i; //成員變量
}
-(id)someMethod:(int)someArg someOtherArgName:(int)someOtherArg; //對象的方法
+(id)someMethod:(int)someArg; //類方法
-(id)init; //初始化方法
int num; //屬性
@implementation
對應(yīng)于@interface的類型聲明,@implementation表示一個類型的實(shí)現(xiàn)過程,同樣以@end結(jié)束,實(shí)現(xiàn)的格式通常如下:
@implementationsomeObject
-(id)someMethod:(int)someArg someOtherArgName:(int)someOtherArg
{
//實(shí)現(xiàn)代碼
}
@synthesize num=i; //將屬性與變量進(jìn)行對應(yīng)
@end
new、alloc
Object C中的方法調(diào)用形式采用消息發(fā)送的方式,通常調(diào)用的形式如
[someObject someMethod:firstArg someOtherArgName:otherArg]
實(shí)例的初始化也采用消息發(fā)送的形式,可以簡單的調(diào)用類型的new方法來獲取一個實(shí)例對象,簡單實(shí)例化的方法通常是:
someObject *obj = [someObjectnew]; //類的實(shí)例化
new方法的實(shí)際過程是調(diào)用alloc和init方法,因此如果需要采用自定義的方法來初始化實(shí)例,則需要自己重寫init方法,通常的初始化方式為:
someObject *obj = [[someObject alloc] init]; //采用無參數(shù)的init實(shí)例化
someObject *obj = [[someObject alloc] initWithArg:Arg]; //采用參數(shù)的實(shí)例化
@class
@class是一個前向引用聲明,類似于C++中的friend友元聲明,其作用是告訴編譯器其后面的字段代表一個類型名稱,盡管不知道類型的具體實(shí)現(xiàn),但是只需要將其作為一個類型名稱處理即可。通常在使用復(fù)合的結(jié)構(gòu)時可以采用@class來減少頭文件的相互引用,如果出現(xiàn)循環(huán)依賴,則需要依靠@class來避免引用的死循環(huán)。通常使用形式為:
someOtherObject;
@interfacesomeObject:NSObject
{
someOtherObject *obj;
}
@end
@property
盡管可以使用obj->arr的形式去強(qiáng)制讀取對象的成員變量,但是良好的編程形式是對外界提供成員變量的讀寫接口。@property關(guān)鍵字提供了外界對成員變量的訪問接口,其本質(zhì)是為某一個屬性提供set和get操作。根據(jù)不同的需要,可以添加readonly(只讀,相當(dāng)于只添加get不添加set方法)或者readwrite(讀寫,如果不添加則為默認(rèn));還有三種賦值方式可選:assign(直接賦值,通常用于基本類型),retain(釋放舊值,增加新的retaincount),copy(常用語字符串,生成一個新的拷貝)。通常使用的方式如下:
someObject:NSObject
{
int i; //成員變量
}
(assign,readonly) int num; //屬性
@synthesize
與@property對應(yīng),將一個外在屬性與成員變量相關(guān)聯(lián),定義在@implementation中,如果屬性名與變量名一致則可以省略變量名。常用方法:
@implementation someObject
@synthesize num=i; //將屬性與變量進(jìn)行對應(yīng)
//如果屬性名也為i,則可以直接寫為 @synthesizei
@end
內(nèi)存管理
Object C采用引用計(jì)數(shù)的方式進(jìn)行內(nèi)存管理,由于所有的對象都繼承于NSObject,因此所有的對象都可以接受NSObject的三個方法:
-(id)retain;

-(void)release;
-(unsigned)retainCount;
retain方法將對象的引用計(jì)數(shù)加一并返回該對象,release將引用計(jì)數(shù)減一,retainCount方法返回對象當(dāng)前的引用計(jì)數(shù)。當(dāng)采用new、alloc、copy方法創(chuàng)建一個對象時,它的引用計(jì)數(shù)被置為1,如果程序中對該對象進(jìn)行操作,則應(yīng)根據(jù)需要,通過調(diào)用retain和release方法來保證該對象在不需要的時候被清除。當(dāng)一個對象的引用計(jì)數(shù)被置為0后,系統(tǒng)會自動向?qū)ο蟀l(fā)送一個dealloc消息,將其占有的資源釋放。通常情況下,如果一個對象的初始化過程調(diào)用了其他資源,則應(yīng)該重寫改對象的dealloc過程,保證在對象的銷毀期正確釋放這些資源。
為了更加方便的進(jìn)行能存管理,cocoa中提供了一個自動釋放池(autorelease pool)的概念,每一個類都繼承了一個autorelease方法,當(dāng)調(diào)用對象的autorelease方法時,改對象會被加入到開始創(chuàng)建的自動釋放池中。當(dāng)程序進(jìn)行到不再需要自動釋放池中的對象時,將自動釋放池釋放的時候會向池中的所有對象發(fā)送一個release消息,從而保證不再需要的對象被正確的釋放。通常的用法如下:
NSAutoreleasePool *pool;
pool = [[NSAutoreleasePool alloc] init];
someObject * obj = [[someObject alloc] init];
[obj autorelease]; //加入自動釋放池
//其他代碼
[pool release]; //執(zhí)行該語句時,系統(tǒng)會向池內(nèi)所有的對象發(fā)送release消息;在這個例子中,如果對obj進(jìn)行的其他retain操作和release操作保持一致的話,則會將obj的引用計(jì)數(shù)變?yōu)?,從而調(diào)用它的dealloc方法進(jìn)行資源釋放
Object C進(jìn)行內(nèi)存管理的3條規(guī)則是:
類別
類別是為現(xiàn)有的類提供一個新的方法的方法,即使沒有一個類的源代碼,仍然可以向類中添加一個方法以方便使用。類別的主要目的有3個:將類的實(shí)現(xiàn)分散到多個不同的文件或框架中,創(chuàng)建對私有方法的前向引用,向?qū)ο筇砑臃钦絽f(xié)議。
類別的聲明方法:
@interfacesomeObject (someProtocal)
-(void)someMethod;
類別的實(shí)現(xiàn)方法:
someObject(someProtocal)
-(void)someMethod
{
}
@end
@protocol
Object C中的協(xié)議類似于java中的接口,通過關(guān)鍵字定義一個或多個需要遵從協(xié)議的對象實(shí)現(xiàn)的方法,協(xié)議定義的方法:
@protocolsomeProtocol
-(void)someMethod;
@end
采用協(xié)議的方法是在類聲明時使用尖括號注明其需要使用的協(xié)議:
@interfacesomeObject:NSObject
在類實(shí)現(xiàn)時需要將協(xié)議中規(guī)定的方法都予以實(shí)現(xiàn)。
Object C 2.0增加了2個新的協(xié)議修飾符@optional和@required,可以規(guī)定協(xié)議中的方法是否為必須實(shí)現(xiàn)的方法。
愛華網(wǎng)本文地址 » http://www.klfzs.com/a/8103350103/66845.html
愛華網(wǎng)



