Category 分類 ,又稱為類別、類目
概念
1 Category有多種翻譯:分類、類別、類目(一般叫分類的多)
2 Category式OC特有的語法,其他語言沒有的語法(類似于C#語言中的"擴展方法"和partial 關鍵字
作用
1 在不修改原有類的基礎上增加新的方法
2 一個龐大的類可以分模式開發
3 一個龐大的類可以由多個人來編寫,更有利于團隊合作
使用Category的作用
1 1)對現有類進行擴展
2 比如,你可以擴展Cocoa touch框架中的類,你在列表中增加的方法會被子類所繼承,而且在運行時跟其他的方法沒有區別
3 2)作為子類的替代手段
4 不需要定義和使用一個子類,你可以通過Category直接向已有的類里增加方法
5 3)對類中的方法歸類
6 利用category把一個龐大的類劃分為小塊來分別進行開發,從而更好地對類中的方法進行更新和維護
使用category的步驟
聲明--->實現---->使用
注意:類別的命名規則
類別+擴展方法,如"NNString+countNum"
類別的接口聲明與類的定義十分相似,但類別不繼承父類,只需要帶有一個括號,表明該類別的主要用途
category聲明
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中沒有聲明的方法,這樣也可以很好的實現方法的私有
標題名稱:OC分類(Category)-創新互聯
網站網址:http://m.newbst.com/article38/dcecsp.html
成都網站建設公司_創新互聯,為您提供手機網站建設、定制網站、網站排名、搜索引擎優化、網站建設、網站導航
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯