OC語言類的深入和分類
一、分類
(一)分類的基本知識
概念:Category 分類是OC特有的語言,依賴於類。
分類的作用:在不改變原來的類內容的基礎上,為類增加一些方法。
添加一個分類:
文件結構圖:
在分類中添加一個方法
Study方法的實現
測試程序:
(二)分類的使用注意
(1)分類只能增加方法(包括類方法和對象方法),不能增加成員變量
(2)在分類方法的實現中可以訪問原來類中的成員變量;
(3)分類中可以重新實現原來類中的方法,但是會覆蓋掉原來的方法,導致原來的方法無法再使用(警告);
(4)方法調用的優先級:分類->原來的類->父類,若包含有多個分類,則最后參與編譯的分類優先;
(5)在很多的情況下,往往是給系統自帶的類添加分類,如NSObject和NSString,因為有的時候,系統類可能並不能滿足我們的要求。
(6)在大規模的應用中,通常把相應的功能寫成一個分類,可以有無限個分類,對原有類進行擴充,一般分模塊寫,一個模塊一個分類。
(三)分類編程練習
(1)給NSString類增加一個類方法,計算某個字符串對象中阿拉伯數字的個數;
(2)給NSString類增加一個對象方法,計算當前字符串對象中阿拉伯數字的個數;
分類中方法的聲明
分類中方法的實現
測試程序:
二、類的深入研究
(一)類的本質
類本身也是一個對象,是class類型的對象,簡稱“類對象”。
Class類型的定義:
Typedef struct obj class *class;
類名就代表着類對象,每個類只有一個類對象。
利用class 創建 Person類
利用Person 創建Person類型的對象
Person *p=[[Person alloc] init];
獲取內存中的類對象有兩種方法:
(1)class c=[p claa];//指向類的對象的指針調用class方法
(2)Class c1=[Person class];//使用類名調用class方法
注意:c和c1打印出來的地址相同,class c2=[p claa];可以證明所有的對象共用一個類方法。
(二)類的加載和初始化
測試程序:
1.當程序啟動時,就會加載項目中所有的類和分類,而且加載后會調用每個類和分類的+load方法,只會調用一次;
2.當第一次使用某個類時,就會調用當前類的+initialize方法;
3.先加載父類,再加載子類(先調用父類的+load方法,再調用子類的+load方法,最后調用分類的+load方法),先初始化父類,再初始化子類(先調用父類的+initialize方法,再調用子類的+initialize方法)。
4.注意:在初始化的時候,如果在分類中重寫了+initialize方法,則會覆蓋掉父類的。
5.重寫+initialize方法可以監聽類的使用情況。