1. 程式人生 > >物件在記憶體中的儲存

物件在記憶體中的儲存

  1. 類載入

    1. 建立物件的時候,肯定是需要訪問類的
    2. 申明1個類的指標變數 也會訪問類
    3. 只有類在第一次被訪問的時候,才會做類載入
      一旦類被載入到程式碼段以後,直到程式結束的時候才會被釋放
      程式碼段中: 主要是儲存person類的程式碼(類的宣告和類實現)

    假設 下面這個程式碼寫在函式之中
    • Person *p1 ;會在棧記憶體中申請一塊空間,在棧記憶體中聲明瞭一個person型別的指標變數p1.
    p1是一個指標變數,只能儲存地址

    • [Person new];真正在記憶體中建立物件的是這句程式碼。
    ○ new做的事情
    § 在堆記憶體中申請一塊合適大小的空間
    § 在這個空間中根據類的模板建立物件
    □ 類模板中定義了什麼屬性,就把這些屬性依次的宣告在物件之中。物件中還有另外一個屬性,叫做isa 指標,指向物件所屬的類在程式碼段當中的地址
    § 初始化物件的屬性(付預設值)
    □ 如果是屬性的型別是基本資料型別,那麼就賦值為0
    □ C語言的指標型別:NULL
    □ OC類指標型別 nil
    § 返回物件的地址

    • 注意:
    ○ 物件中只有屬性 而沒有方法,自己類的屬性外加一個isa指標指向程式碼段當中的類。
    ○ 如何訪問物件的屬性
    § 指標名->屬性
    § 根據指標 找到指標指向的物件 再找到物件中得屬性來訪問
    § 如何呼叫方法:
    [指標名 方法名];
    先根據指標名找到物件,物件發現要呼叫方法,再根據物件的isa指標找到類

    • 為什麼不把方法儲存在物件之中?
    ○ 因為每一個物件的程式碼的實現都是一模一樣的,沒有必要為每一個物件都儲存1個方法,這樣的話,太浪費空間了,既然都一樣,那麼只儲存一份。
    • 物件的屬性的預設值
    ○ 建立一個物件,沒有為物件的屬性賦值,那麼這個物件的屬性是有值的
    § 基本資料型別 0
    § c指標型別 NULL
    § OC 指標 nil