標籤:
Objective-C類和對象總結:
標頭檔.h檔案:(header file)
類的聲明:@interface 類名字 : 父類的名稱
類名的約定:1、首字母大寫,比如Person
父類:通常是NSObject,我們也可以自己指定父類。
類的聲明是@end作為結束符。
源檔案.m檔案(source file):放屬性、方法的具體實現。
實現的結構:
#import “xxx.h”//匯入類聲明的標頭檔
@implementation 類名稱
…….屬性和方法的具體實現...........
@end//以@end作為結束符
成員變數:
一個實體所具有的特徵
聲明:
成員變數必須包括在大括弧重
@interface 類名:父類名稱
{
//在這個大括弧裡面,聲明成員變數
}
@private、@protected 、@public用於控製成員變數的可訪問性(存取權限)
@private 私人成員==》只允許當前類訪問
@protected 受保護的成員==》允許當前類和子類進行訪問。
預設就是protected(聲明成員變數的時候,不指定預設就是@protected)
@public 公用成員====》所有的類都能夠訪問。
成員變數的約定:
Objc裡面,所有的物件類型的變數都必須使用指標,也就是除了基本的資料類型(int,char,float,double,BOOL)之外的變數,都需要使用指標。
比如:一個類的實體,結構體,數組。
在ObjC中不管是自訂的類還是系統類別對象都必須是一個指標
定義好了一個類之後,我們進行執行個體化的時候,有兩個步驟:
1)、分配記憶體===》alloc
2)、對實體進行初始化===》init
推薦執行個體化的寫法:
類名稱 *變數名=[[類名稱 alloc] init];
方法分類:
1)靜態方法 用+定義
2)動態方法 用-定義
定義方法的格式:
無參數:
+/- (傳回值類型) 方法名稱;
有一個參數的時候,參數前面需要冒號:
+/- (傳回值類型) 方法名稱 : (參數的類型)參數名稱;
如果有多個參數,我們在第二個參數以後的參數之前,加一個參數說明,方便我們調用的時候,快速的瞭解方法裡面參數的含義
+/- (傳回值類型) 方法名稱:(參數的類型)參數名稱 第二個參數的說明:(第二個參數的類型)第二個參數的名稱..........
如果沒有在.h中聲明,而是直接在.m中定義則該方法是私人方法,外部無法訪問。私人方法只允許在當前源檔案中調用。其它的類無法訪問。
調用靜態方法和動態方法的區別:
靜態方法:只允許使用類名稱進行調用
動態方法:只允許在類裡面(在類的源檔案中直接調用)或者是通過執行個體化的對象去調用
屬性:通常都是通過對應的setter或者是getter方法進行實現的。
約定:setter方法通常是在屬性名稱前加一個set,getter方法通常是直接使用屬性名稱(不加get)
Objc的點文法:
指標變數名稱.屬性名稱
點文法具體到是調用setter方法還是調用getter方法,取決於當前的操作是賦值還是讀取
賦值(=)的時候就是調用setter方法,讀取的時候調用getter方法。
@property和@synthesize關鍵字:
我們定義屬性的代碼基本是一致的,我們使用@property和@synthesize自動產生getter、setter方法。
- 如果只聲明一個屬性a,不使用@synthesize實現:編譯器會使用_a作為屬性的成員變數(如果沒有定義成員變數_a則會自動產生一個私人privated的成員變數_a;如果已經定義了成員變數_a則使用自訂的成員變數_a。注意:如果此時定義的成員變數不是_a而是a則此時會自動產生一個成員變數_a,它跟自訂成員變數a沒有任何關係);
- 如果聲明了一個屬性a,使用@synthesize a進行實現,但是實現過程中沒有指定使用的成員變數(例如上面birthday):則此時編譯器會使用a作為屬性的成員變數(如果定義了成員變數a,則使用自訂成員變數;如果此時沒有定義則會自動產生一個私人的成員變數a,注意如果此時定義的是_a則它跟產生的a成員變數沒有任何關係);
- 如果聲明了一個屬性a,使用@synthesize a=_a進行實現,這個過程已經指定了使用的成員變數:此時會使用指定的成員變數作為屬性變數;
self關鍵字:不僅可以表示當前對象還可以表示類本身
self可以調用動態方法和靜態方法
self的實質:指標===》這個指標是指向當前的調用者。
self就代表當前方法的調用者
構造方法:
預設的構造方法是init,繼承自NSObject這個類。
我們可以使用自己的構造方法(傳參數等)
id類型:
id類型可以代表所有的類型(自己定義的類或者系統定義的類),大多數情況下,也是一個指標。
id類型在啟動並執行時候,才能確定具體的類型。
運用id的地方:通常是返回一個類的執行個體化的對象(指標)的時候
super關鍵字:代表父類。
使用super關鍵字的時候,是直接調用父類的方法的。
即便是子類重寫了相同的方法,super調用的,也是父類的方法。
description方法:
定義在NSObject
我們使用%@輸出的時候,就會調用description方法。(使用%@的地方不限於NSLog)
重寫description方法,通常是按照一定的格式,答應類的成員變數或者屬性。
重寫的description,嚴格禁止直接列印self(引起死迴圈)
預設情況下如果我們不重寫description方法,輸出內容是類名和地址,例如Person則輸出“<Person: 0x100202310>”。
繼承:
繼承是可以遞迴的:比如B繼承自C,A也可以繼承自B A===>B====>C
Objc不允許多繼承:也就是我們聲明類的時候,不允許在冒號後寫多個類的名字,因為Objc只能允許單整合。
子類:可以直接存取父類成員變數(private的不允許),屬性
子類可以調用父類的公開的方法
子類也可以複寫父類的公開的方法。
子類和父類的成員變數:
子類和父類成員變數是獨立的,子類的實體修改了成員變數的值,不會父類,父類修改了成員變數的值,也不會影響子類。子類和父類,即便是成員變數有繼承關係,但是他們都是獨立的。
類調用方法:
首先,在當前類,尋找被調用的方法,如果當前類,實現了被調用的方法,就會直接調用當前類的方法。
如果當前類,沒有實現被調用的方法,程式會自動向上尋找直接父類,如果在父類裡面定義了被調用的方法,就會調用父類的方法,。
如果父類還找不到被調用的方法,程式會再次向上尋找,一直查到NSObject。
最終如果尋找到NSObject(Objc的基類),都沒有找到方法的定義,這個時候編譯器會報錯。
使用super關鍵字,調用的是這個類的直接父類中的方法。如果父類中找不到被調用的方法,程式向上級的父類進行尋找,一直到NSObject為止。
宏定義:
#define 宏定義名稱 字串(不需要使用@“”包住)
作用:用到宏定義的地方,編譯器會自動的把宏定義名稱右邊的字串整個的複製。
BOOL類型:值有兩個YES和NO,實質上BOOL是一個unsigned char,YES的值是1,NO的值為0.
oc裡面,進行邏輯比較的時候(if語句等)同樣遵守C語言的規範:
非0值為真,0值為假。
SEL變數:
SEL:是方法的唯一ID。同名的方法ID相同。
我們可以通過如下幾種方式取得SEL變數的值:
1、@selector(方法名)
2、NSSelectorFromString(@“方法名”)
通過SEL變數調用方法的格式:
[對象 performSelector:SEL變數 withObject:參數1 withObject:參數2];
函數指標:
指向函數的指標變數。
定義函數指標,有兩種方式。
1、跟C語言函數指標類似
2、使用IMP,使用IMP定義函數指標的時候,需要將xcode的編譯參數:enable strict Checking of objc_msgSend Calls設定為NO,調用的時候才能正確編譯。
Class類型:
通過一個普通的字串取得一個類的定義。
Class類型的變數取得了類的定義之後,就可以認為,我們這個Class變數是一個已知的類。
就可以執行個體化對象、進行方法調用等操作。
1 Class 變數名 = [類或者對象 class];
2 Class 變數名 = [類或者對象 superclass];
3 Class 變數名 = NSClassFromString(方法名字的字串);
特殊方法:
[對象 className]:返回的是對象的類名稱
[對象 respondsToSelector : SEL變數名]:判斷對象是否具有SEL變數所指向的函數。如果沒有SEL變數所指向的這個函數,傳回值為NO
Objective-C類和對象總結