iOS分類和擴展(Categories和Extensions)


分類(Category)
 
分類能夠做到的事情主要是: 即使在你不知道一個類的源碼情況下,向這個類添加擴展的方法
 
此外,分類能夠保證你的實現類和其他的文件區分開。
 
View Code
1 #import “UIViewController.h”
2 @interface UIViewController(CustomView)
3 -(void)extMethod;
4 @end

 

  使用分類為類添加方法(Add Methods to Classes)
 
通過在interface中聲明一個額外的方法 並且在implementation 中定義相同名字的方法即可。分類的名字(也就是括號括起來的CustomView)表示的是: 對於聲明於其他地方的這個類(UIViewController),在此處添加的方法是額外的,而不是表示這是一個新的類你不可以通過分類為一個類添加額外的成員變量
 
在implementation中,引入頭文件的時候主要引用的方式是:
 
View Code
1 #import “UIViewController+CustomView.h”
2 @implementation UIViewController(CustomView)
3 -(void)extMethod;
4 @end

 

 另外,雖然Category不能夠為類添加新的成員變量,但是Category包含類的所有成員變量,即使是@private的。Category可以重新定義新方法,也可以override繼承過來的方法。
 
類擴展(Class Extensions)
 
類擴展就像匿名( 也就是沒有那個括號里面的名字CustomView)的分類一樣,除了一樣不同的是,類擴展聲明必須在@implementation在實現。
 
先看一段代碼:
View Code
 1 @interface MyObject:NSObject
 2 {
 3 NSNumber* number;
 4 }
 5 -(NSNumber*)getNum;
 6 @end
 7  
 8 @interface MyObject(Setter)
 9 -(void)setNum:(NSNumber*)num;
10 @end
11  
12 @implementation MyObject
13 -(NSNumber*)getNum
14 {
15 return number;
16 }

 

 看上面這段代碼,有沒有問題?編譯器編譯的時候,這段代碼是可以編譯通過,但當運行時,就會報錯。為什么?
 
因為沒有實現Category中的setNum方法。而用類擴展去實現,請看:
View Code
 1 @interface MyObject:NSObject
 2 {
 3 NSNumber* number;
 4 }
 5 -(NSNumber*)getNum;
 6 @end
 7  
 8 @interface MyObject() //注意這里的括號里面是沒有名字的
 9 -(void)setNum:(NSNumber*)num;
10 @end
11  
12 @implementation MyObject
13 -(NSNumber*)getNum
14 {
15 return number;
16 }
17  
18 -(void)setNum:(NSNumber*)num
19 {
20 number = num;
21 }
22 @end

 

 setNum是必須要實現,不然編譯器會提出警告。
 
從上面看出,分類和類擴展的相似之處是: 都可以為類添加一個額外的方法
 
不同之處在於: 要添加額外方法,分類必須在第一個@interface中聲明方法,並且在@implementation中提供實現,不然運行時出錯。而類擴展,你添加的方法是一個required API,如果不去實現,編譯器會警告,而且這個方法的聲明可以不在第一個@interface中去聲明。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM