Objective C 一一 OC類的本質

2021-08-04 03:35:20 字數 1419 閱讀 6543

1、什麼是類?

類是用來描述物件的,是一系列屬性和方法的集合

可以通過乙個類來建立乙個物件,物件訪問該類中的屬性和方法.

2、類的本質.

2.1 類可以建立物件,但類本身其實也是乙個物件,這個物件會在這個類第一次被使用的時候建立.

只要有類物件,就可以通過類物件來建立例項物件.

例項物件中有乙個isa指標,指向建立自己的類物件

2.2 說到這裡有人問什麼是isa指標,isa指標是每乙個物件中都有的乙個隱藏指標,這個指標指向當前物件所屬的

類.當給乙個例項物件方法訊息的時候,會根據例項物件中的isa指標去對應的類物件中去查詢物件方法.

舉個例子. 乙個student類

student例項物件中-----isa指標--->student類物件-----isa指標--->student元類物件-----isa指標--->根元類物件

每乙個物件中都有乙個isa指標,去指向建立該物件所屬的那個類,根元類物件的isa指標指向自己本身!

根元類物件相當於nsobject的元類物件

2.3 類物件: 它其中儲存了類中的屬性和物件方法

元類物件: 儲存了類中的 類方法

所以當乙個物件呼叫乙個物件方法的時候,物件的isa指標會指向類物件,去類物件中查詢是否有這個物件方法

如果有,直接呼叫

呼叫類方法的時候,直接去元類物件中查詢,因為元類物件中儲存的都是類方法!

3、所有類的 類物件 的繼承關係就是 元類物件 的繼承關係.

比如student類繼承與person類.student類物件就繼承於person的類物件

student的元類物件就繼承與person的元類物件

假設 person類中有乙個物件方法test,和乙個類方法demo

student類中有乙個物件方法test1,和乙個類方法demo1

student *stu = [ [student alloc] init] ;

[stu test];

[student demo];

此時student的例項物件呼叫person類中的test方法.首先例項物件的isa指標會先去student的類物件中

去找有沒有test方法(因為類物件方法中儲存的是物件方法),發現沒有,會繼續去student的父類person的

類物件中去找.找到了就呼叫test方法

同理student類呼叫類方法demo,會先去student的元類物件中去找,如果沒有就去student的父類

person的元類物件中去找(因為元類物件中儲存的都是類方法).

所以說 所有類的 類物件 的繼承關係就是 元類物件 的繼承關係.

4、為了更好的理解類的本質,下面有一副圖大家可以理解一下.

Objective C 一一 id型別

id 是乙個資料型別 並且是乙個動態資料型別 id是乙個資料型別 並且是乙個動態資料型別 既然是資料型別 所以就可以用來 1.定義變數 2.作為函式的引數 3.作為函式的返回值 靜態型別和動態型別 為什麼要有動態型別?id資料型別與靜態型別 靜態型別 將乙個指標變數定義為特定類的物件時,使用的是靜態...

Objective C 07 OC物件的繼承

1 繼承的好處 1.1 繼承可以抽取重複的 減少 量,提高 的利用性 1.2 物件導向的多型就是基於繼承 1.3 繼承建立了類與類之間的關係 1.4 子類可以擁有父類中的所有成員變數和方法 1.5 當子類想要擁有和父類同名但是不一樣的實現方式時,可以重寫父類的方法,提高 的靈活性 2 繼承的宣告 2...

objective C程式 C與OC的對比

引入標頭檔案 c中的引入標頭檔案的方式 include include 沒有報錯 import 引入標頭檔案 為什麼引入import import 和include都是引入標頭檔案,import引入的標頭檔案可以防止重複包含 include他是使用預處理指令防止重複包含,如果沒有寫預處理指令,則無法...