OC:類別和擴展(Categories和Extensions)??

  • 版權聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉載。

分類(Category)

分類能夠做到的事情主要是:即使在你不知道一個類的源碼情況下,向這個類添加擴展的方法。

  • 此外,分類能夠保證你的實現(xiàn)類和其他的文件區(qū)分開。
#import “UIViewController.h”
@interface UIViewController(CustomView)
-(void)extMethod;
@end```


###使用分類為類添加方法(Add Methods to Classes)
 
>通過在`interface`中聲明一個額外的方法并且在`implementation` 中定義相同名字的方法即可。`分類`的名字(也就是括號括起來的CustomView)表示的是:`對于聲明于其他地方的這個類(UIViewController),在此處添加的方法是額外的,而不是表示這是一個新的類。`你不可以通過分類為一個類添加額外的成員變量。
 
- 在implementation中,引入頭文件的時候主要引用的方式是:

import “UIViewController+CustomView.h”

@implementation UIViewController(CustomView)
-(void)extMethod;
@end```

另外,雖然Category不能夠為類添加新的成員變量,但是Category包含類的所有成員變量,即使是@private的。Category可以重新定義新方法,也可以override繼承過來的方法。

類擴展(Class Extensions)

類擴展就像匿名(也就是沒有那個括號里面的名字CustomView)的分類一樣,除了一樣不同的是,類擴展聲明必須在@implementation在實現(xiàn)。

  • 先看一段代碼:
 @interface MyObject:NSObject
 {
   NSNumber* _number;
 }
 
-(NSNumber*)getNum;
 
 @end
 
@interface MyObject(Setter)
-(void)setNum:(NSNumber*)num;
@end
  
@implementation MyObject
-(NSNumber*)getNum
{
   return _number;
}```


######看上面這段代碼,有沒有問題?編譯器編譯的時候,這段代碼是可以編譯通過,但當運行時,就會報錯。為什么?
 
>因為沒有實現(xiàn)Category中的setNum方法。而用類擴展去實現(xiàn),請看:

@interface MyObject:NSObject
{
NSNumber* _number;
}
-(NSNumber*)getNum;
@end

@interface MyObject() //注意這里的括號里面是沒有名字的
-(void)setNum:(NSNumber*)num;
@end

@implementation MyObject
-(NSNumber*)getNum
{
return _number;
}

-(void)setNum:(NSNumber*)num
{
_number = num;
}
@end```

  • setNum是必須要實現(xiàn),不然編譯器會提出警告。

從上面看出,分類和類擴展的相似之處是:都可以為類添加一個額外的方法;

不同之處在于:要添加額外方法,分類必須在第一個@interface中聲明方法,并且在@implementation中提供實現(xiàn),不然運行時出錯。而類擴展,你添加的方法是一個required API,如果不去實現(xiàn),編譯器會警告,而且這個方法的聲明可以不在第一個@interface中去聲明。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容