關鍵字
@
看到這個關鍵字,我們就應該想到,這是Object-C對C語言的擴展,例如@interface XXX。
@interface
聲明類
@implementation
實現類
@protocol
聲明協議
@optional
與@protocol配合使用,說明協議中的某個或者某幾個方法可以不實現
@required
與@protocol配合使用,說明協議中的某個方法或者某幾個方法必須實現
@end
與@interface ,@implementation,@protocol配合使用,代表聲明或者實現結束
@encode
@encode為編譯器宏,它可以將類型轉換為相應的字符串。
id
id是指向Objective-C類對象的指針,它可以聲明為任何類對象的指針,當在Objective-C中使用id時,編譯器會假定你知道,id指向哪個類的對象。與void*是不同的是,void*編譯器不知道也不假定指向任何類型的指針。
nil
定義為一個常量,如果一個指針的值為nil,代表這個指針沒有指向任何對象。
self
在Objective-C中,關鍵字self與c++中this是同一概念,就是類對象自身的地址,通過self可以調用自己的實例變量和方法

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