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...