物件在記憶體中的儲存
類載入
- 建立物件的時候,肯定是需要訪問類的
- 申明1個類的指標變數 也會訪問類
- 只有類在第一次被訪問的時候,才會做類載入
一旦類被載入到程式碼段以後,直到程式結束的時候才會被釋放
程式碼段中: 主要是儲存person類的程式碼(類的宣告和類實現)
假設 下面這個程式碼寫在函式之中
• Person *p1 ;會在棧記憶體中申請一塊空間,在棧記憶體中聲明瞭一個person型別的指標變數p1.
p1是一個指標變數,只能儲存地址• [Person new];真正在記憶體中建立物件的是這句程式碼。
○ new做的事情
§ 在堆記憶體中申請一塊合適大小的空間
§ 在這個空間中根據類的模板建立物件
□ 類模板中定義了什麼屬性,就把這些屬性依次的宣告在物件之中。物件中還有另外一個屬性,叫做isa 指標,指向物件所屬的類在程式碼段當中的地址
§ 初始化物件的屬性(付預設值)
□ 如果是屬性的型別是基本資料型別,那麼就賦值為0
□ C語言的指標型別:NULL
□ OC類指標型別 nil
§ 返回物件的地址• 注意:
○ 物件中只有屬性 而沒有方法,自己類的屬性外加一個isa指標指向程式碼段當中的類。
○ 如何訪問物件的屬性
§ 指標名->屬性
§ 根據指標 找到指標指向的物件 再找到物件中得屬性來訪問
§ 如何呼叫方法:
[指標名 方法名];
先根據指標名找到物件,物件發現要呼叫方法,再根據物件的isa指標找到類○
• 為什麼不把方法儲存在物件之中?
○ 因為每一個物件的程式碼的實現都是一模一樣的,沒有必要為每一個物件都儲存1個方法,這樣的話,太浪費空間了,既然都一樣,那麼只儲存一份。
• 物件的屬性的預設值
○ 建立一個物件,沒有為物件的屬性賦值,那麼這個物件的屬性是有值的
§ 基本資料型別 0
§ c指標型別 NULL
§ OC 指標 nil