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