iOS Category + Extension

  • **Category (以NSObject為例) **
//NSObject+NSObjectCategory.h
@interface NSObject (NSObjectCategory)  
-(NSString *)className;    
@end
//NSObject+NSObjectCategory.m
@implementation NSObject (NSObjectCategory)          
//1.增加新方法
-(NSString *)className {
    return @"NSObject";
}

//2.覆蓋原類的方法
-(NSString *)description {
    return @"Description of NSObject";
}
@end

分類特點(diǎn)

  • 在不知道類代碼的情況下,可以給類增加方法。
     項(xiàng)目中,經(jīng)常以分類的方式,減少重復(fù)代碼以及保持代碼的一致性。比如:項(xiàng)目中需要統(tǒng)一設(shè)置UIButton的UIControlStateNormal和UIControlStateSelected顏色,可以建UIColor的分類,新增方法來(lái)解決。好處是后期修改方便,而且可以避免寫錯(cuò)等。
    說(shuō)起增加方法,繼承也可以做到這種目的,但繼承明顯感覺比重高。
  • 分類可以拆分一個(gè)類的方法到多個(gè)文件中
     創(chuàng)建分類時(shí)可以根據(jù)業(yè)務(wù)將方法分開到多個(gè)文件中。比如Downloader的分類,可以創(chuàng)建Downloader+Image.h,Downloader+Movie.h等分類。尤其在大的項(xiàng)目中,這個(gè)可以大量節(jié)省修改一個(gè)方法導(dǎo)致編譯重新連接耗時(shí)時(shí)間長(zhǎng)。
     以此反向推測(cè): 一個(gè)類可以多個(gè)分類組成,在該類的.h中導(dǎo)入這些分類即可。
  • 覆蓋(重寫)原類的方法
     能覆蓋類方法的原因是runtime中分類加載時(shí)機(jī)在之后。
    可以利用該特點(diǎn),不用繼承子類可以修復(fù)類方法的bug。
     這里有個(gè)問題是,如果一個(gè)類的兩個(gè)分類,都重寫了同一個(gè)方法,那么在runtime中到底哪個(gè)分類后執(zhí)行覆蓋是個(gè)不確定的,有些資料顯示以編譯器以Build Phases -> Compile Source文件順序決定(從高到低),即使這樣,這規(guī)則太隱含了,不可采取,還是去修改類的方法為上上策。
  • 分類不能添加成員變量
     在分類中添加Propery時(shí),只會(huì)生成該屬性的get,set方法的聲明,而不會(huì)生成實(shí)現(xiàn)。
  • 分類的方法中,不可以調(diào)用super方法
     因?yàn)榉诸愐呀?jīng)在原類的角色Working。
  • 分類中可以訪問原有類.h中的屬性
  • Extension 最熟悉的陌生人
//Person.h
@interface Person : NSObject
- (void)test;
@end
//Person.m
#import "Person.h"

//下面這行就是Extension
@interface Person () {
    int _age;
}
@end

@implementation Person

- (void)test {
    NSLog(@"person test");
    [self run];
    NSLog(@"person test:%d", _age);
}

- (void)run {
    _age = 19;
}

- (void)work {
    _height = 12;
}

@end

擴(kuò)展特點(diǎn),上面代碼@interface Person ()就是EXTENSION

  • 可以添加該類的私有成員變量,屬性
     擴(kuò)展的.h文件只能在類的.m中導(dǎo)入,這樣類中才能訪問成員變量。
  • 可以聲明方法
     聲明的方法必須在類中實(shí)現(xiàn),否則編譯器會(huì)警告??。
  • 匿名分類
     說(shuō)到擴(kuò)展,都會(huì)提到匿名分類這個(gè)詞。

如有錯(cuò)誤,歡迎糾正。

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

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,695評(píng)論 19 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,323評(píng)論 25 708
  • 沒有一個(gè)長(zhǎng)篇 如此短 我用一句話 寫完一個(gè)長(zhǎng)篇 我想愛你 卻不敢
    龍貓先先生閱讀 172評(píng)論 0 2
  • 這一篇有點(diǎn)標(biāo)題黨,因?yàn)榘l(fā)是寫在簡(jiǎn)書上,就按照這個(gè)格式寫了,如果有幸被轉(zhuǎn)載到別的平臺(tái),也算是給簡(jiǎn)書打個(gè)廣告了。其實(shí)我...
    遠(yuǎn)行客閱讀 1,140評(píng)論 7 24
  • 滑膜炎是怎樣得的啊 滑膜炎一般多為慢性損傷,患病后患者常常感到活動(dòng)受限,上下樓關(guān)節(jié)疼痛、不敢使勁、不敢下蹲,久坐站...
    叫我7閱讀 478評(píng)論 0 0

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