Category 分類 ,又稱爲類別、類目框架
概念spa
1 Category有多種翻譯:分類、類別、類目(通常叫分類的多) 2 Category式OC特有的語法,其餘語言沒有的語法(相似於C#語言中的"擴展方法"和partial 關鍵字
做用翻譯
1 在不修改原有類的基礎上增長新的方法 2 一個龐大的類能夠分模式開發 3 一個龐大的類能夠由多我的來編寫,更有利於團隊合做
使用Category的做用code
1 1)對現有類進行擴展 2 好比,你能夠擴展Cocoa touch框架中的類,你在列表中增長的方法會被子類所繼承,並且在運行時跟其餘的方法沒有區別 3 2)做爲子類的替代手段 4 不須要定義和使用一個子類,你能夠經過Category直接向已有的類裏增長方法 5 3)對類中的方法歸類 6 利用category把一個龐大的類劃分爲小塊來分別進行開發,從而更好地對類中的方法進行更新和維護
使用category的步驟對象
聲明--->實現---->使用 注意:類別的命名規則 類別+擴展方法,如"NNString+countNum" 類別的接口聲明與類的定義十分類似,但類別不繼承父類,只須要帶有一個括號,代表該類別的主要用途
category聲明blog
1 在.h文件中,聲明類別: 2 3 @interface ClassName(CategoryName) 4 NewMethod; //在類別中添加方法 5 //不容許在類別中添加變量 6 @end 7 8 9 說明: 10 聲明類別格式: 11 1)新增長的方法必須在寫@interface 與 @end之間 12 2)ClassName 現有類的類名(要爲哪一個類擴展方法) 13 3)CategoryName 待聲明的類別名稱 14 4)NewMethod 新增長的方法 15 注意: 16 不容許在聲明類別的時候定義變量
category實現繼承
1 在.m文件中(也能夠在.h中實現),實現類別: 2 @implementation ClassName(CategoryName) 3 NewMethod{ 4 ...... 5 } 6 @end 7 8 說明: 9 實現類別格式 10 1)新方法的實現必須寫在 @implementation 與@end之間 11 2)ClassName 現有類的類名 12 3)CategoryName 待聲明的類別名稱 13 4)NewMethod 新增長的方法的實現
1.接口
2.開發
3.編譯器
也能夠經過圖形界面生成類別
1.
2.
3.
分類的使用注意事項
1 1)分類只能增長方法,不能增長成員變量、@property(可能編譯不報錯,可是運行有問題) 2 2)分類能夠訪問原來類中的成員變量 3 3)若是分類和原來類出現同名方法,優先調用分類中的方法,原來類中的方法會被忽略 4 4)方法調用的優先級(從高到低) 5 分類(最後參與編譯的分類優先),只要有分類就優先調用分類,不考慮與主類的編譯順序
分類的編譯順序
最下面的最後編譯
Category的非正式協議
1 非正式協議: 2 非正式協議就是給NSObject類建立的類目又叫作非正式協議,非正式協議通常不須要進行實現,通常在子類中進行方法的重寫. 3 4 例如: 5 #import "NSObject+run.h" 6 7 @implementation NSObject (run) 8 -(void)run{ 9 NSLog(@"NSObject run"); 10 } 11 @end 12 13 而後寫個Student 繼承與NSObject 14 這樣Student就能夠直接運行 run方法 15 Student *stu = [Student new]; 16 [stu run]; 17 18 這就是非正式協議
Category延展
1 概念: 2 延伸類別又稱爲擴展(Extendsion)(也能夠理解爲匿名類別) 3 Extension是Category是一個特例 4 其名字爲匿名(爲空),而且新增長的方面必定要予以實現.(Category沒有這個限制) 5 例如: @interface Student() 6 @end 7 8 實現: 9 經過延展來實現方法的私有,延展的頭文件獨立.這種方法不能實現真正的方法私有,當在別的文件中引入延展的頭文件,那麼在這個文件中定義的類的對象就能夠直接調用在延展中定義所謂私有的方法 10 //對類的延展-隱藏方法 wrap的一種手段(非強制) 11 .h文件 12 @interface SceneManager() 13 +(void)wrap; 14 @end 15 16 .m文件 17 @implementation SceneManager 18 +(void)wrap{ 19 ..... 20 } 21 @end 22 23 調用: 24 [SceneManager wrap]; 25 //這裏會報一個警告: Class method of "+wrap" not found 26 //不過雖然是警告,不過運行是正常的,不過這麼寫得自我規範上很差,即便編譯器沒有作強制限制,咱們本身也要限制本身 27 //否則,延展方法就毫無心義可言 28 29 第二種實現: 30 延展的方式是延展沒有獨立的頭文件,在類的實現文件.m中聲明和實現延展,這種方法能夠很好地實現方法的私有,由於在OC中是不能引入.m的文件的 31 32 .m文件 33 @interface SceneManager() 34 +(void)wrap; 35 @end 36 @implementation SceneManager 37 +(void)wrap{ 38 ...... 39 } 40 @end 41 42 調用 43 [SceneManager wrap]; 44 45 第三種實現: 46 私有的方式是在.m文件中得@implementation中直接實如今@interface中沒有聲明的方法,這樣也能夠很好的實現方法的私有