IOS開發(fā)之OC關鍵字-創(chuàng)新互聯(lián)

關鍵字

@

看到這個關鍵字,我們就應該想到,這是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)結束

@encode

@encode為編譯器宏,它可以將類型轉換為相應的字符串。  

id

id是指向Objective-C類對象的指針,它可以聲明為任何類對象的指針,當在Objective-C中使用id時,編譯器會假定你知道,id指向哪個類的對象。與void*是不同的是,void*編譯器不知道也不假定指向任何類型的指針。IOS開發(fā)之OC關鍵字

nil

定義為一個常量,如果一個指針的值為nil,代表這個指針沒有指向任何對象。

self

在Objective-C中,關鍵字self與c++中this是同一概念,就是類對象自身的地址,通過self可以調用自己的實例變量和方法

目前創(chuàng)新互聯(lián)建站已為超過千家的企業(yè)提供了網(wǎng)站建設、域名、網(wǎng)頁空間、成都網(wǎng)站托管、企業(yè)網(wǎng)站設計、朝陽縣網(wǎng)站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

Super

當子類需要調用父類的方法時,會用到Super關鍵字. Super指向的是父類的指針,子類重寫父類的方法時,調用父類的方法是一個比較好的習慣。因為當我們不知道父類在該方法中實現(xiàn)的功能時,如果不調用父類的方法,有可能我們重寫的方法會失去該功能,這是我們不愿意看到的情況。

NSNull

NSNull是沒有的意思,如果一個字典的值為NSNull,那說明與該值對應的Key是沒有值的,例如Key為address,說明與address對應的是值是沒有。

 

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中,使用%@表示要調用對象的description方法。

概念

是一種結構,它表示對象的類型,就像int與 char 一樣,也可以聲明類的變量(對像)  

實例化

為類的對象分配內(nèi)存和初始化,達到可以使用該 類對象的目的。  

對象(實例)

類的實例化后的產(chǎn)物  

消息

在Object-C中,類的對象執(zhí)行的操作,是通過給該類或者該類對象發(fā)送消息實現(xiàn),如:[object func];就是給object對象發(fā)送func消息,類似C++中的方法調用。給object對象發(fā)送func消息后,object對象查詢所屬類的func方法執(zhí)行。

方法調度

當向一個對象發(fā)送消息時(調用方法),這個方法是怎么被調用的呢?這就依賴于方法高度程序,方法調度程序查找的方法如下: 在本類的方法中,找被調用的方法,如果找到了,就調用,如果找不到被沿著繼承路徑去查找,從哪個類找到,就調用哪個類的方法,如果到最根上的類還是沒有找到,那編譯就會出錯。

繼承與復合

在Objective-C中支持繼承,但只是支持單一繼承(有且只有一個父類有),如果想使用多繼承的特性,可以使用分類和協(xié)議技術。 繼承是is-a,復合是has-a。復合是通過包含指向對象的指針實現(xiàn)的,嚴格意義上講,復合是針對于對象間來說,對于基本數(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方法是修改或者設置實例值,命名習慣為set+實例名,例有一個類有path實例變量,那setter命名為setPath,getter命名為Path,為什么不是getPath,因為get在Cocoa中有特殊的含義,這個含義就是帶有get的方法就意味著這個方法通過形參指針(傳入函數(shù)的參數(shù)指針)來返回值。我們要遵守這個命名習慣或者說規(guī)則。 在Objective-C 2.0中加入了@property和@synthesize來代替setter和getter,這兩個關鍵字為編譯器指令。 還有點表達式,存取類成員的值時,可以使用點表達式。 Object.attribute,當點表達式在=號左邊時,調用的是setter方法,在=號右邊時,調用的是getter方法。 @property 語法為:@property (參數(shù)) 類型 變量名. 在這里主要說明一下參數(shù). 參數(shù)分為三種:   第一種:讀寫屬性包括(readonly/readwrite/)   第二種:setter屬性(assign,copy,retain),assign是簡單的賦值,copy是釋放舊成員變量,并新分配內(nèi)存地址給成員變量,將傳入?yún)?shù)內(nèi)容復制一份,給成員變量。retain是將傳 入   參數(shù)引用計數(shù)加1,然后將原有的成員變量釋放,在將成員變量指向該傳入?yún)?shù)。   第三種:與多線程有關(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中叫嵌套調用。 為什么要嵌套調用??因為初始化方法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ù)要調用指定初始化函數(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,當一個對象調用這個方法時,就會將這個對象放入到自動釋放池中。 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ù)

每個對象都有一個與之相應的整數(shù),稱它為引用計數(shù),當該 引用計數(shù)為0時,Objective-C自動向該對象發(fā)送dealloc,以銷毀該對向,與該引用計數(shù)相關的方法(消息)有下面幾個 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)建對象,則需要主動調用對象的release方法  2 如果使用非alloc,new,copy創(chuàng)建對象,我們認為該 對象引用計數(shù)為1,并已經(jīng)加入了自動釋放池,我們不需要主動的調用對象的release方法。 擁有對象(在類中以成員的方法存在):  1 如果使用alloc,new,copy創(chuàng)建對象,則需要在dealloc方法中,釋放該對象 2 如果使用非alloc,new,copy創(chuàng)建對象,則在擁有該對象時,保留該對象(執(zhí)行retain方法),在dealloc方法中,釋放該對象。  

dealloc

當對象的引用計數(shù)為0時,Objective-C會自動發(fā)送對象的dealloc消息(自動調用對象的dealloc方法,類似于C++的析構函數(shù)),所以我們可以自己重寫dealloc方法,來實現(xiàn)類里的對其它使用資源的釋放工作。 注意:不要直接在代碼中顯示調用dealloc方法。 

垃圾回收

在Objective-C 2.0中引入了垃圾回收機制(自動管理內(nèi)存),在工程設置里設置Objective-C Garbage Collection為Required[-fobjc-gc-only]就可以使用垃圾回收機制。 啟用垃圾回收機制后,通常的內(nèi)存管理命令都變成了空操作指令,不執(zhí)行任何操作。 Objective-C的垃圾回收機制是一種繼承性的垃圾回收器,垃圾回收器定期檢查變量和對象以及他們之間的指針,當發(fā)現(xiàn)沒有任何變量指向對象時,就將該對象視為被丟棄的垃圾。所以在不在使用一個對象時,將指針他的指針設置為nil,這時垃圾回收器就會清理該對象。 注意:如果開發(fā)iPhone軟件,則不能使用垃圾回收。在編寫iPhone軟件時,Apple公司建議不要在自己的代碼中使用autorelease方法,并且不要使用創(chuàng)建自動釋放對象的函數(shù)。  

類別

什么是類別?類別是一種為現(xiàn)有類添加新方法的方式。 為什么使用類別或者說使用類別的目的是什么?有以下三點:  第一,可以將類的實現(xiàn)分散到多個不同的文件或多個不同的框架中。   如果一個類需要實現(xiàn)很多個方法,我們可以將方法分類,把分好的類形成類別,可以有效的管理和駕馭代碼。 第二,創(chuàng)建對私有方法的前向引用。 第三,向對象添加非正式協(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)被委托的任務。 拿上面的例子來說,Apple要求Foxconn除了能生產(chǎn)iPhone外,還有一個要求是在一定時間內(nèi)完成.由于雙方?jīng)]有簽合同,所以時間要求和生產(chǎn)要求規(guī)格都是非正式協(xié)議

選擇器

選擇器就是一個方法的名稱。選擇器是在Objective-C運行時使用的編碼方式,以實現(xiàn)快速查找??梢允褂聾selector預編譯指令,獲取選擇器@selector(方法名)。NSObject提供了一個方法respondsToSelector:的方法,來訪問對象是否有該方法(響應該消息)。 拿上面的Apple請Foxconn生產(chǎn)iPhone為例,Apple怎么知道Foxconn有沒有生產(chǎn)iPhone的能力呢?Apple就通過respondsToSelector方法詢問Foxconn,是否可以生產(chǎn)iPhone(是否可以響應produceIPhone),詢問結果是可以,那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又增加了兩個關鍵字,協(xié)議中的方法也可以不完全實現(xià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關鍵字-創(chuàng)新互聯(lián)
URL鏈接:http://muchs.cn/article44/ddcghe.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供微信公眾號定制網(wǎng)站、網(wǎng)頁設計公司、網(wǎng)站策劃、商城網(wǎng)站全網(wǎng)營銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設