對於OC物件,引用以及isa的理解

2021-08-14 07:41:36 字數 1386 閱讀 4802

1、使用類建立乙個物件

person

p  = [[

person 

alloc

]init];

1)person

* p 

表示建立乙個

person

型別的引用,引用名為p。

事實上在objc的runtime中,

物件是用 objc_object 結構體表示的。所以這時指明引用的型別只是為了編譯和編輯方便。

如不指明

p的型別,p

就無法呼叫

person

中的方法和屬性。(強行呼叫要報錯的,除非強轉否則無法通過編譯)

2)[person 

alloc

]表示建立乙個person

型別的物件並為其分配記憶體空間。

在堆記憶體中申請合適的空間,在空間中,根據類的模板,建立物件。

物件中只有屬性,沒有方法 。

isa指標,指向**段中的類。

如何訪問物件的屬性:指標名字

->

屬性名(根據指標,找到指標指向的物件,再找到物件中的屬性來訪問)

如何呼叫方法:

現根據指標的找到物件,物件發現要呼叫方法,在分局物件的

isa指標找到類,然後呼叫類裡面的方法

元類裡儲存了這個類的類方法列表

3)init 執行初始化方法。

2、擴充套件 如何理解父類引用指向子類物件這一行為。

引用的本質就是乙個常量指標,而限制其指向的是宣告的引用型別。引用是什麼型別在runtime時並不重要(此處的不重要僅指在呼叫方法和屬性的過程中),因為所有的物件都是以objc_object 結構體

表示的。所以理論上乙個引用可以指向任何型別的物件,但這樣做存在極大的不確定因素。

如:

a//類a包含兩個方法 funa和funb

b//類b包含兩個方法 funb和func

//類a中的funb與類a中的funb僅僅是方法名一致

a a = [b new];

執行 [a funa] 報錯!訊息實際上傳送給b的例項物件,但找不到funa。

執行 [a funb] 正常!訊息實際上傳送給b的例項物件,能找到funb。該funb是類b中的方法

執行 [a func] 無法通過編譯。

但是父類引用指向子類物件卻是例外,因為子類繼承了父類中的所有方法屬性。因而在執行是一定不會發生錯誤。

C 引用,以及引用與指標的區別

在c 中不只是有取位址的意思,還有引用的意思。引用變數是乙個別名,也就是說,它是某個已存在變數的另乙個名字。一旦把引用初始化為某個變數,就可以使用該引用名稱或變數名稱來指向變數,其實可以把它想像成指標,但又區別於指標。引用示例 int r i double s d 引用很容易與指標混淆,它們之間有三...

oc中copy的簡單使用以及注意事項

copy修飾字串,可以防止外界修改內部的資料 inte ce student nsobject property nonatomic,strong nsstring name endnsmutablestring temp nsmutablestring alloc initwithformat l...

類的使用以及類與物件的關係

siwuxie095 1 類的定義 宣告以及使用 定義格式 宣告乙個類需要通過關鍵字 class 注意 小寫 類名遵循帕斯卡命名法 又稱 大駝峰命名法 屬性和方法可選 2 類與物件的關係 類是對某一類事物的描述,是抽象的 概念上的意義,物件是實際存在的 該類事物的每乙個個體,也被稱為例項 3 記憶體...