Objective-C類和對象總結

來源:互聯網
上載者:User

標籤:

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類和對象總結

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.