關(guān)鍵字
@
看到這個(gè)關(guān)鍵字,我們就應(yīng)該想到,這是Object-C對(duì)C語(yǔ)言的擴(kuò)展,例如@interface XXX。
@interface
聲明類(lèi)
@implementation
實(shí)現(xiàn)類(lèi)
@protocol
聲明協(xié)議
@optional
與@protocol配合使用,說(shuō)明協(xié)議中的某個(gè)或者某幾個(gè)方法可以不實(shí)現(xiàn)
@required
與@protocol配合使用,說(shuō)明協(xié)議中的某個(gè)方法或者某幾個(gè)方法必須實(shí)現(xiàn)
@end
與@interface ,@implementation,@protocol配合使用,代表聲明或者實(shí)現(xiàn)結(jié)束
@encode
@encode為編譯器宏,它可以將類(lèi)型轉(zhuǎn)換為相應(yīng)的字符串。
id
id是指向Objective-C類(lèi)對(duì)象的指針,它可以聲明為任何類(lèi)對(duì)象的指針,當(dāng)在Objective-C中使用id時(shí),編譯器會(huì)假定你知道,id指向哪個(gè)類(lèi)的對(duì)象。與void*是不同的是,void*編譯器不知道也不假定指向任何類(lèi)型的指針。
nil
定義為一個(gè)常量,如果一個(gè)指針的值為nil,代表這個(gè)指針沒(méi)有指向任何對(duì)象。
self
在Objective-C中,關(guān)鍵字self與c++中this是同一概念,就是類(lèi)對(duì)象自身的地址,通過(guò)self可以調(diào)用自己的實(shí)例變量和方法
目前
創(chuàng)新互聯(lián)建站已為超過(guò)千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)頁(yè)空間、
成都網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計(jì)、
朝陽(yáng)縣網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶(hù)導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶(hù)和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
Super
當(dāng)子類(lèi)需要調(diào)用父類(lèi)的方法時(shí),會(huì)用到Super關(guān)鍵字. Super指向的是父類(lèi)的指針,子類(lèi)重寫(xiě)父類(lèi)的方法時(shí),調(diào)用父類(lèi)的方法是一個(gè)比較好的習(xí)慣。因?yàn)楫?dāng)我們不知道父類(lèi)在該方法中實(shí)現(xiàn)的功能時(shí),如果不調(diào)用父類(lèi)的方法,有可能我們重寫(xiě)的方法會(huì)失去該功能,這是我們不愿意看到的情況。
NSNull
NSNull是沒(méi)有的意思,如果一個(gè)字典的值為NSNull,那說(shuō)明與該值對(duì)應(yīng)的Key是沒(méi)有值的,例如Key為address,說(shuō)明與address對(duì)應(yīng)的是值是沒(méi)有。
self super class public protected private id
[self class] [super class] selector
objective-c runtime reference
標(biāo)準(zhǔn)用法
self = [super init]
new
1 Objective-C有一個(gè)特性,就是可以把類(lèi)當(dāng)成對(duì)象來(lái)發(fā)送消息,這種用法通常用于新建對(duì)像時(shí),例如 XXX *object = [XXX new];
類(lèi)方法 +
如果想聲明屬于類(lèi)而不屬于類(lèi)對(duì)象的方法,用+。+用來(lái)修飾類(lèi)的方法,使用+修飾的類(lèi)方法,是整個(gè)類(lèi)的方法,不屬于哪一個(gè)類(lèi)對(duì)象,這與C++中的static在類(lèi)中使用的概念一樣,
%@
在NSLog中,使用%@表示要調(diào)用對(duì)象的description方法。
概念
類(lèi)
是一種結(jié)構(gòu),它表示對(duì)象的類(lèi)型,就像int與 char 一樣,也可以聲明類(lèi)的變量(對(duì)像)
實(shí)例化
為類(lèi)的對(duì)象分配內(nèi)存和初始化,達(dá)到可以使用該 類(lèi)對(duì)象的目的。
對(duì)象(實(shí)例)
類(lèi)的實(shí)例化后的產(chǎn)物
消息
在Object-C中,類(lèi)的對(duì)象執(zhí)行的操作,是通過(guò)給該類(lèi)或者該類(lèi)對(duì)象發(fā)送消息實(shí)現(xiàn),如:[object func];就是給object對(duì)象發(fā)送func消息,類(lèi)似C++中的方法調(diào)用。給object對(duì)象發(fā)送func消息后,object對(duì)象查詢(xún)所屬類(lèi)的func方法執(zhí)行。
方法調(diào)度
當(dāng)向一個(gè)對(duì)象發(fā)送消息時(shí)(調(diào)用方法),這個(gè)方法是怎么被調(diào)用的呢?這就依賴(lài)于方法高度程序,方法調(diào)度程序查找的方法如下:
在本類(lèi)的方法中,找被調(diào)用的方法,如果找到了,就調(diào)用,如果找不到被沿著繼承路徑去查找,從哪個(gè)類(lèi)找到,就調(diào)用哪個(gè)類(lèi)的方法,如果到最根上的類(lèi)還是沒(méi)有找到,那編譯就會(huì)出錯(cuò)。
繼承與復(fù)合
在Objective-C中支持繼承,但只是支持單一繼承(有且只有一個(gè)父類(lèi)有),如果想使用多繼承的特性,可以使用分類(lèi)和協(xié)議技術(shù)。
繼承是is-a,復(fù)合是has-a。復(fù)合是通過(guò)包含指向?qū)ο蟮闹羔槍?shí)現(xiàn)的,嚴(yán)格意義上講,復(fù)合是針對(duì)于對(duì)象間來(lái)說(shuō),對(duì)于基本數(shù)據(jù)類(lèi)型來(lái)說(shuō),它們被認(rèn)為是對(duì)象的一部分。
裝箱與拆箱
由于NSArray,NSDirectory等類(lèi)不能直接存儲(chǔ)基本數(shù)據(jù)類(lèi)型,所以要想在NSArray\NSDirectory中使用基本數(shù)據(jù)類(lèi)型,就得使用裝箱與拆箱。
在Objective-C中,可以使用NSNumber和NSValue來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)類(lèi)型的包裝,NSNumber可以實(shí)現(xiàn)對(duì)基本數(shù)據(jù)類(lèi)型的包裝,NSValue可以實(shí)現(xiàn)對(duì)任意類(lèi)型數(shù)據(jù)的包裝。
將基本類(lèi)型封裝成對(duì)象叫裝箱,從封裝的對(duì)象中提取基本類(lèi)型叫拆箱(取消裝箱),其它語(yǔ)言如Java原生支持裝箱與拆箱,Ojbective-C不支持自動(dòng)裝箱與拆箱,如果需要得需要自己來(lái)實(shí)現(xiàn)裝箱與拆箱。
存取方法
在使用類(lèi)對(duì)象的實(shí)例變量(成員數(shù)據(jù))時(shí),不要直接使用對(duì)象中的實(shí)例,要使用存以方法來(lái)獲取或者修改實(shí)例,既setter和getter,在Cocoa中,存取方法有命名習(xí)慣,我們得符合這種習(xí)慣,以便于與其它團(tuán)隊(duì)成員合作。setter方法是修改或者設(shè)置實(shí)例值,命名習(xí)慣為set+實(shí)例名,例有一個(gè)類(lèi)有path實(shí)例變量,那setter命名為setPath,getter命名為Path,為什么不是getPath,因?yàn)間et在Cocoa中有特殊的含義,這個(gè)含義就是帶有g(shù)et的方法就意味著這個(gè)方法通過(guò)形參指針(傳入函數(shù)的參數(shù)指針)來(lái)返回值。我們要遵守這個(gè)命名習(xí)慣或者說(shuō)規(guī)則。
在Objective-C 2.0中加入了@property和@synthesize來(lái)代替setter和getter,這兩個(gè)關(guān)鍵字為編譯器指令。 還有點(diǎn)表達(dá)式,存取類(lèi)成員的值時(shí),可以使用點(diǎn)表達(dá)式。
Object.attribute,當(dāng)點(diǎn)表達(dá)式在=號(hào)左邊時(shí),調(diào)用的是setter方法,在=號(hào)右邊時(shí),調(diào)用的是getter方法。
@property 語(yǔ)法為:@property (參數(shù)) 類(lèi)型 變量名.
在這里主要說(shuō)明一下參數(shù).
參數(shù)分為三種:
第一種:讀寫(xiě)屬性包括(readonly/readwrite/)
第二種:setter屬性(assign,copy,retain),assign是簡(jiǎn)單的賦值,copy是釋放舊成員變量,并新分配內(nèi)存地址給成員變量,將傳入?yún)?shù)內(nèi)容復(fù)制一份,給成員變量。retain是將傳 入 參數(shù)引用計(jì)數(shù)加1,然后將原有的成員變量釋放,在將成員變量指向該傳入?yún)?shù)。
第三種:與多線程有關(guān)(atomic,nonatomic).當(dāng)使用多線程時(shí),使用atomic,在不使用多線程時(shí)使用nonatomic
對(duì)象創(chuàng)建與初始化
在Objective-C中創(chuàng)建對(duì)象有兩種方法,一種是[類(lèi) new];另一種是[[類(lèi) alloc] init],這兩種方法是等價(jià)的,但按慣例來(lái)講,使用[[類(lèi) alloc] init];
alloc操作是為對(duì)象分配內(nèi)存空間,并將對(duì)象的數(shù)據(jù)成員都初始,int 為0,BOOL 為NO, float 為0.0等。
初始化,默認(rèn)的初始化函數(shù)為init,init返回值為id,為什么回返回id呢,因?yàn)橐獙?shí)現(xiàn)鏈?zhǔn)奖磉_(dá)式,在Objective-C中叫嵌套調(diào)用。
為什么要嵌套調(diào)用??因?yàn)槌跏蓟椒╥nit返回值可能與alloc返回的對(duì)象不是同一個(gè)?為什么會(huì)發(fā)生這種情況?基于類(lèi)簇的初始化,因?yàn)閕nit可以接受參數(shù),在init內(nèi)部有可能根據(jù)不同的參數(shù)來(lái)返回不同種類(lèi)型的對(duì)象,所以最會(huì)發(fā)生上面說(shuō)的情況。
在初始化時(shí),建議使用if (self = [super init])
便利初始化
當(dāng)一個(gè)類(lèi)需要根據(jù)不同的情況來(lái)初始化數(shù)據(jù)成員時(shí),就需要便利初始化函數(shù),與init初始化不同的是,便利初始化函數(shù)有參數(shù),參數(shù)個(gè)數(shù)可以有1到N個(gè),N是類(lèi)數(shù)據(jù)成員個(gè)數(shù)。
指定初始化函數(shù):什么是指定初始化函數(shù)?在類(lèi)中,某個(gè)初始化函數(shù)會(huì)被指定為指定的初始化函數(shù),確定指定初始化函數(shù)的規(guī)則是初始化函數(shù)中,參數(shù)最多的為指定初始化函數(shù),
其它未被指定為指定初始化函數(shù)的初始化函數(shù)要調(diào)用指定初始化函數(shù)來(lái)實(shí)現(xiàn)。對(duì)于該類(lèi)的子類(lèi)也是一樣,只要重寫(xiě)或者直接使用父類(lèi)的指定初始化函數(shù)。上述文字有些繞,來(lái)個(gè)例子吧
@interface A{
int x;
int y;
}
-(id) init;
-(id) initWithX:(int) xValue;
-(id) initWithY:(int) yValue;
-(id) initWithXY:(int) xValue
yVal:(int) yValue;
@end
這里initWithXY被確定為指定初始化函數(shù)。
-(id) initWithXY:(int) xValue
yVal:(int) yValue{
if (self = [super init]){
x = xValue;
y = yValue;
}
return self;
}
-(id) init{
if (self = self initWithXY:10
yVal:20){
}
return self;
}
.......
@interface B: A{
int z;
}
-(jd) initWithXY......;
@end
@implementation B
-(id) initWithXY:(int) xValue
yVal:(int) yValue{
if (self = [super initWithXY:10
yVal=20]){
z= 40;
}
return self;
}
@end
自動(dòng)釋放池
內(nèi)存管理是軟件代碼中的重中之重,內(nèi)存管理的好壞,直接影響著軟件的穩(wěn)定性。在Cocoa中,有自動(dòng)釋放池,這類(lèi)似于C++中的智能指針。
NSObject有一個(gè)方法是autorelease,當(dāng)一個(gè)對(duì)象調(diào)用這個(gè)方法時(shí),就會(huì)將這個(gè)對(duì)象放入到自動(dòng)釋放池中。
drain,該方法是清空自動(dòng)釋放池,不是銷(xiāo)毀它。drain方法只適用于Mac OS X 10.4以上的版本,在我們寫(xiě)的代碼中要使用release,release適用于所有版本。
自動(dòng)釋放池是以棧的方式實(shí)現(xiàn),當(dāng)創(chuàng)建一個(gè)自動(dòng)釋放池A時(shí),A被壓入棧頂,這時(shí)將接入autorelease消息的對(duì)象放入A自動(dòng)釋放池,這時(shí)創(chuàng)建一個(gè)新的B自動(dòng)釋放池,B被壓入棧頂,創(chuàng)建完成后刪除B,這個(gè)接收autorelease消息的對(duì)象依然存在,因?yàn)锳自動(dòng)釋放池依然存在。
引用計(jì)數(shù)
每個(gè)對(duì)象都有一個(gè)與之相應(yīng)的整數(shù),稱(chēng)它為引用計(jì)數(shù),當(dāng)該 引用計(jì)數(shù)為0時(shí),Objective-C自動(dòng)向該對(duì)象發(fā)送dealloc,以銷(xiāo)毀該對(duì)向,與該引用計(jì)數(shù)相關(guān)的方法(消息)有下面幾個(gè)
1 增加引用計(jì)數(shù):通過(guò)alloc,new,copy創(chuàng)建一個(gè)對(duì)象時(shí),該對(duì)象的引用計(jì)數(shù)加1(其實(shí)就是1,因?yàn)橹盀?)
2 增加引用計(jì)數(shù): retain
3 減少引用計(jì)數(shù): release
局部分配內(nèi)存(臨時(shí)對(duì)象):
1 如果使用alloc,new,copy創(chuàng)建對(duì)象,則需要主動(dòng)調(diào)用對(duì)象的release方法
2 如果使用非alloc,new,copy創(chuàng)建對(duì)象,我們認(rèn)為該 對(duì)象引用計(jì)數(shù)為1,并已經(jīng)加入了自動(dòng)釋放池,我們不需要主動(dòng)的調(diào)用對(duì)象的release方法。
擁有對(duì)象(在類(lèi)中以成員的方法存在):
1 如果使用alloc,new,copy創(chuàng)建對(duì)象,則需要在dealloc方法中,釋放該對(duì)象
2 如果使用非alloc,new,copy創(chuàng)建對(duì)象,則在擁有該對(duì)象時(shí),保留該對(duì)象(執(zhí)行retain方法),在dealloc方法中,釋放該對(duì)象。
dealloc
當(dāng)對(duì)象的引用計(jì)數(shù)為0時(shí),Objective-C會(huì)自動(dòng)發(fā)送對(duì)象的dealloc消息(自動(dòng)調(diào)用對(duì)象的dealloc方法,類(lèi)似于C++的析構(gòu)函數(shù)),所以我們可以自己重寫(xiě)dealloc方法,來(lái)實(shí)現(xiàn)類(lèi)里的對(duì)其它使用資源的釋放工作。
注意:不要直接在代碼中顯示調(diào)用dealloc方法。
垃圾回收
在Objective-C 2.0中引入了垃圾回收機(jī)制(自動(dòng)管理內(nèi)存),在工程設(shè)置里設(shè)置Objective-C Garbage Collection為Required[-fobjc-gc-only]就可以使用垃圾回收機(jī)制。
啟用垃圾回收機(jī)制后,通常的內(nèi)存管理命令都變成了空操作指令,不執(zhí)行任何操作。
Objective-C的垃圾回收機(jī)制是一種繼承性的垃圾回收器,垃圾回收器定期檢查變量和對(duì)象以及他們之間的指針,當(dāng)發(fā)現(xiàn)沒(méi)有任何變量指向?qū)ο髸r(shí),就將該對(duì)象視為被丟棄的垃圾。所以在不在使用一個(gè)對(duì)象時(shí),將指針?biāo)闹羔樤O(shè)置為nil,這時(shí)垃圾回收器就會(huì)清理該對(duì)象。
注意:如果開(kāi)發(fā)iPhone軟件,則不能使用垃圾回收。在編寫(xiě)iPhone軟件時(shí),Apple公司建議不要在自己的代碼中使用autorelease方法,并且不要使用創(chuàng)建自動(dòng)釋放對(duì)象的函數(shù)。
類(lèi)別
什么是類(lèi)別?類(lèi)別是一種為現(xiàn)有類(lèi)添加新方法的方式。
為什么使用類(lèi)別或者說(shuō)使用類(lèi)別的目的是什么?有以下三點(diǎn):
第一,可以將類(lèi)的實(shí)現(xiàn)分散到多個(gè)不同的文件或多個(gè)不同的框架中。
如果一個(gè)類(lèi)需要實(shí)現(xiàn)很多個(gè)方法,我們可以將方法分類(lèi),把分好的類(lèi)形成類(lèi)別,可以有效的管理和駕馭代碼。
第二,創(chuàng)建對(duì)私有方法的前向引用。
第三,向?qū)ο筇砑臃钦絽f(xié)議。
委托
委托的意思就是你自己想做某事,你自己不做,你委托給別人做。
在Ojbective-C中,實(shí)現(xiàn)委托是通過(guò)類(lèi)別(或非正式協(xié)議)或者協(xié)議來(lái)實(shí)現(xiàn)。
舉個(gè)例子:Apple要生產(chǎn)iPhone,Apple自己不生產(chǎn)(種種原因,其中之一就是在中國(guó)生產(chǎn)成本低,他們賺的銀子多),Apple委托富士康來(lái)生產(chǎn),本來(lái)富士康原來(lái)不生產(chǎn)iPhone,現(xiàn)在要生產(chǎn)了,所以他得自己加一個(gè)生產(chǎn)iPhone的生產(chǎn)線(類(lèi)別,增加生產(chǎn)iPhone方法),這就是通過(guò)類(lèi)別來(lái)實(shí)現(xiàn)委托。下面用代碼來(lái)說(shuō)明這個(gè)例子。
.....
Apple *apple = [[Apple alloc ] init];
Foxconn *fox = [[Foxconn alloc] init];[apple setDelegate:fox];
[apple produceIPhone];
........
@implementation Apple
-(...) setDelegate:(id) x{
delegate = x; //! 將委托的生產(chǎn)對(duì)象指定為x
}
-(...) produceIPhone{
[delegate produceIPhone]; //! 委托對(duì)象生產(chǎn)iPhone
}
@interface Foxconn : NSObject
...
@end
@interface NSObject(ProduceIPhone) //! Foxconn之前就可以生產(chǎn)其它產(chǎn)品,有過(guò)聲明和定義
-(...) produceIPhone //! 增加生產(chǎn)iPhone能力
@end
@implementation NSObject(ProduceIPhone)
//! 生產(chǎn)iPhone
-(...) produceIPhone{
......
}
@end
非正式協(xié)議
創(chuàng)建一個(gè)NSObject的類(lèi)別, 稱(chēng)為創(chuàng)建一個(gè)非正式協(xié)議。為什么叫非正式協(xié)議呢?
也就是說(shuō)可以實(shí)現(xiàn),也可以不實(shí)現(xiàn)被委托的任務(wù)。
拿上面的例子來(lái)說(shuō),Apple要求Foxconn除了能生產(chǎn)iPhone外,還有一個(gè)要求是在一定時(shí)間內(nèi)完成.由于雙方?jīng)]有簽合同,所以時(shí)間要求和生產(chǎn)要求規(guī)格都是非正式協(xié)議
選擇器
選擇器就是一個(gè)方法的名稱(chēng)。選擇器是在Objective-C運(yùn)行時(shí)使用的編碼方式,以實(shí)現(xiàn)快速查找??梢允褂聾selector預(yù)編譯指令,獲取選擇器@selector(方法名)。NSObject提供了一個(gè)方法respondsToSelector:的方法,來(lái)訪問(wèn)對(duì)象是否有該方法(響應(yīng)該消息)。
拿上面的Apple請(qǐng)F(tuán)oxconn生產(chǎn)iPhone為例,Apple怎么知道Foxconn有沒(méi)有生產(chǎn)iPhone的能力呢?Apple就通過(guò)respondsToSelector方法詢(xún)問(wèn)Foxconn,是否可以生產(chǎn)iPhone(是否可以響應(yīng)produceIPhone),詢(xún)問(wèn)結(jié)果是可以,那Apple就委托Foxconn生產(chǎn),F(xiàn)oxconn就生產(chǎn)出來(lái)了人們比較喜歡的iPhone產(chǎn)品。
正式協(xié)議
與非正式協(xié)議比較而言,在Ojbective-C中,正式協(xié)議規(guī)定的所有方法必須實(shí)現(xiàn)。在Ojbective-C2.0中,Apple又增加了兩個(gè)關(guān)鍵字,協(xié)議中的方法也可以不完全實(shí)現(xiàn),是哪個(gè)關(guān)鍵字見(jiàn)關(guān)鍵字部份的@optional,@required。
正式協(xié)議聲明如下:
@protocol XXX
-(...) func1;
-(...) func2;
@end
使用協(xié)議:
@interface Object : NSObject
//! Object從NSObject派生,并遵循XXX協(xié)議,要實(shí)現(xiàn)func1,func2函數(shù)。
...
@end
習(xí)慣用法
分配內(nèi)存和初始化
self = [super init];
對(duì)象間交互
在Objective-C中,所有對(duì)象間的交互都是通過(guò)指針實(shí)現(xiàn)。
快速枚舉
for (Type *p in array)注意:
Objective-C不支持多繼承
文章標(biāo)題:IOS開(kāi)發(fā)之OC關(guān)鍵字-創(chuàng)新互聯(lián)
當(dāng)前路徑:http://weahome.cn/article/ddcghe.html