OC類的深入研究

2021-07-04 16:41:24 字數 4166 閱讀 7743

1、類在建立物件之前也需要載入進空間,也需要佔據記憶體。

2、類只會被載入一次。類也是乙個物件,但它的型別是class型別,就是說類本身也是乙個物件,是個class型別的物件,簡稱類物件。例如新建乙個person類的物件person *p=[[person alloc] init];那麼p就是person型別,而person是個class型別的類物件。但平時所說的類就是類物件。

3、由以上得知,建立乙個物件的過程是:先由class類建立出乙個類物件,再由類物件建立出乙個具體的物件。例如建立乙個person物件時先由class建立person類物件,再利用person類物件建立出person型別的物件。

4、獲取記憶體中類物件(即物件中isa指標的方法):[物件名  class];

利用物件直接呼叫從根類繼承而來的class物件方法即可返回class型別的資料。注意:類物件是class型別的資料,class型別是指標型別,所以在宣告class型別的類物件時不能再加「*」,因為是個位址,所以在列印時用%p列印位址。

5.獲取類物件的幾種方法:

(一)、在外部獲取

(1)class  c=[物件名 class] ;或class  c=物件名.class;

(2)class  c=[類名   class];或class  c=類名.class;

(二)、在成員方法內獲取

無論是在物件方法還是類方法中都可以用以下方式獲取(值都一樣):

classc=[self class];或class c=self.class;

6、獲取的類物件的作用:

類名就代表類物件,用類名可以直接呼叫類方法還可以建立物件。利用類物件同樣也可以直接呼叫類方法,也可以建立物件。

就是說:類物件==類  類物件和類具有同樣的功能。類物件的由來:

乙個類在記憶體中只有乙個儲存空間,我們稱這個儲存空間為類物件。之所以稱為類_物件,是因為它也是由class這個類建立出來的。

7、類的載入過程:

先載入父類,再載入子類。當程式一啟動的時候就會把所有的類都載入了一遍。驗證類是否被載入的方法:每個類被載入完時都會呼叫根類的類方法+(void)load;注意:因為每個類都會被載入一次,僅僅一次,所以每乙個類的load類方法都會被執行一次(僅僅一次)。驗證時只需要在實現中重寫根類的類方法+(void)load即可。

切記:只要程式一啟動就會把所有的類給載入一遍,切記是所有的類,不管用到還是沒有用到只要在同乙個程式都會被載入一遍。

8、監聽類的載入過程:

(1)在類被載入的時候呼叫:+(void)load;這個根類的類方法

(2)在類被載入完畢時再呼叫:+(void)initialize;這個類方法。

注意:對於+(void)load;這個類方法——>當程式啟動的時候就會載入一次專案中所有的類。類載入完畢時就會呼叫+load方法。

而對於+(void)initialize;這個用於初始化操作的類方法——>當第一次使用這個類的時候,就會被呼叫一次(僅僅一次),如果從未使用就不會被載入,此處的初始化是指類的初始化。

(3)當所有類載入完畢,使用某個類時會先呼叫這個類的父類initialize方法初始化這個類從父類繼承來的成員,然後再呼叫自身的initialize方法初始化自己擴充套件的成員。

(4)分類也會被載入。注意:可以在分類中重寫load方法覆蓋,但不會覆蓋原先類(分類為誰而寫的,誰就是原先類)的load方法。分類的load方法最後會被載入。分類中也可以重寫initialize類方法進行監聽。當所有類和分類都被載入完成時,使用某個類時,如果使用的這個類沒有分類或分類中沒有重寫+initialize方法就會呼叫這個類的initialize類方法,如果使用的這個類有分類且分類中重寫了+initialize方法,就會呼叫分類的initialize方法而絕對不會再呼叫父類的initialize類方法,這是因為分類的優先順序大於原先類的優先順序,用原先類呼叫任何方法時也與此類似,先從分類找,找不到就依次從原先類、父類中尋找。

9、總結:

(1)當程式啟動時,就會載入專案中所有的類和分類,而且載入後會呼叫每個類和分類的+load方法。只會呼叫一次。

(2)當第一次使用某個類時,就會使用當前類的+initialize方法(如果有分類且分類中也重寫了+initialize方法的情況下只會呼叫分類的+initialize方法);

(3)載入時,先載入父類再載入子類(先呼叫父類的+load方法,再呼叫子類的+load方法)。初始化的時候,會先初始化父類,再初始化子類(先呼叫父類的+initialize方法,再呼叫子類的+initialize方法)。

10、如果想在類的第一次初始化的時候做一些事情,就要為它重寫+initialize方法。

**驗證,例項如下:

//

// man.h

// 類的深入研究

////

#import @inte***ce man : nsobject

@end

//

// man.m

// 類的深入研究

////

#import "man.h"

@implementation man

-(id)init

return self;

}+(void)load

+(void)initialize

@end

//

// person.h

// 類的深入研究

////

#import "man.h"

@inte***ce person : man

@end

//

// person.m

// 類的深入研究

////

#import "person.h"

@implementation person

-(id)init

return self;

}+(void)load

+(void)initialize

@end

新建student.h如下:

//

// student.h

// 類的深入研究

////

#import "person.h"

@inte***ce student : person

@end

//

// student.m

// 類的深入研究

////

#import "student.h"

@implementation student

-(id)init

return self;

}+(void)load

+(void)initialize

@end

為student新建分類如下: 編輯

student+mj.h如下:

//

// student+mj.h

// 類的深入研究

////

#import "student.h"

@inte***ce student (mj)

@end

編輯

student+mj.m如下:

//

// student+mj.m

// 類的深入研究

////

#import "student+mj.h"

@implementation student (mj)

+(void)load

+(void)initialize

@end

//

// main.m

// 類的深入研究

////

#import #import "student.h"

int main(int argc, const char * argv)

return 0;

}

執行結果如下:

類的深入研究

1.在 person.h 裡面新增兩個方法宣告 void eat 和 void run import inte ce person nsobject void eat void run end 在 person.m 裡面實現方法 import person.h implementation pers...

flex Bindable深入研究

bindable 元資料標籤,它在 中的作用就是向編譯器提供如何編譯程式的資訊。它的最大作用是使程式元件間的資料同步變得容易。在開發中通常用上bindable作用在檢視控制項上,如給它繫結乙個物件,則以後只需要在邏輯層更改這個物件的值,則檢視層的控制項資料會自動更新 同步 而不再需要手動去更新檢視。...

URLRequest深入研究

urlrequest 的乙個例項 html view plain copy create the request.所構建的nsurlrequest具有乙個依賴於快取響應的特定策略,cachepolicy取得策略,timeoutinterval取得超時值 nsurlrequest therequest...