iOS之category深入理解

引用:

無(wú)論一個(gè)類設(shè)計(jì)的多么完美,在未來(lái)的需求演進(jìn)中,都有可能會(huì)碰到一些無(wú)法預(yù)測(cè)的情況。那怎么擴(kuò)展已有的類呢?一般而言,繼承和組合是不錯(cuò)的選擇。但是在Objective-C 2.0中,又提供了category這個(gè)語(yǔ)言特性,可以動(dòng)態(tài)地為已有類添加新行為。如今category已經(jīng)遍布于Objective-C代碼的各個(gè)角落,從Apple官方的framework到各個(gè)開源框架,從功能繁復(fù)的大型APP到簡(jiǎn)單的應(yīng)用,catagory無(wú)處不在

兩種類型:

  • 1
    eg:著名的MJRefresh
普通的分類.png
  • 2 class-continuation 分類(其實(shí)不能算是分類,緊緊是private的作用)

eg:

注意事項(xiàng):

  • 命名:如果分類方法的命名和類中方法名相同則實(shí)際是覆蓋(并不是真正意義上的覆蓋,詳情可以看文章末尾推薦的文章)了類中的方法,所以命名很重要,如著名的SDWebImage UIImageView的分類 方法名均以sd_打頭


    SDWebImage.png
  • 實(shí)例變量可以放到class-continuation 分類中,也可以放到實(shí)現(xiàn)文件中,個(gè)人建議放到
    class-continuation 分類,因?yàn)楹退接袑傩?、方法放一起?huì)更清晰一些

作用:

  1. 她可以為任何類添加新的方法,包括那些沒有源代碼的類,無(wú)需創(chuàng)建對(duì)象類的子類就能完成同樣的工作
  2. 將類的實(shí)現(xiàn)代碼分散到便于管理的數(shù)個(gè)分類中,這樣會(huì)清晰很多
  3. 便于調(diào)試,call stack(回溯信息中)查看較方便
  4. 私有方法放入class-continuation 分類中隱藏細(xì)節(jié)(雖然不是真正的私有但是這樣做是可以隱藏很多不需要調(diào)用人知道的細(xì)節(jié))
  5. 關(guān)聯(lián)對(duì)象 (MJRefresh就是這樣做的)可參考iOS之category
  6. 屬性:只讀狀態(tài)可以擴(kuò)充為可讀寫 不直接訪問(wèn)實(shí)例變量 而是通過(guò)設(shè)置方法訪問(wèn)來(lái)做 因?yàn)檫@樣可以觸發(fā)KVO,外部既不能修改,內(nèi)部又可以按需求管理數(shù)據(jù)

下面寫個(gè)demo具體解釋,還是以Student類為例

@interface Student : NSObject

@property (nonatomic,copy,readonly) NSString *firstName;  // 這里設(shè)為只讀,不想外部改動(dòng)
@property (nonatomic,copy,readonly) NSString *lastName;

- (instancetype)initWithFirstName:(NSString*)firstName lastName:(NSString*)lastName;

@end


#import "Student.h"

@interface Student()

@property (nonatomic,copy,readwrite) NSString *firstName;
@property (nonatomic,copy,readwrite) NSString *lastName;

// 這邊可以寫方法原型,方法的聲明
- (void)p_do1;
- (void)p_do2;
- (void)p_do3;

@end

@implementation Student

#pragma mark -  life circle
- (instancetype)initWithFirstName:(NSString*)firstName lastName:(NSString*)lastName {
    if (self = [super init]) {
        _firstName = [firstName copy];
        _lastName = [lastName copy];
    }
    return self;
}

- (void)dealloc {
    NSLog(@"%s",__func__);
}

#pragma mark -  public method

#pragma mark -  private method
- (void)p_do1 {
    self.firstName = @"john";
}

- (void)p_do2 {

}

- (void)p_do3 {

}

@end
@interface Student (Study)

- (void)ttt_study;
- (void)ttt_studyEnglish;

@end


#import "Student+Study.h"

@implementation Student (Study)

- (void)ttt_study {
    
}

- (void)ttt_studyEnglish {
    // 這里故意寫一個(gè)數(shù)組越界的情況為了解釋分類調(diào)試方便
    NSArray* arr = @[];
    NSObject* obj = arr[1];
    NSLog(@"study english");
}

@end
@interface Student (Play)

- (void)ttt_play;
- (void)ttt_playLOL;

@end

Play的實(shí)現(xiàn)就不粘上來(lái)了

如上所示:

  1. Student類有兩個(gè)屬性均為只讀,還有一個(gè)快捷初始化方法,在實(shí)現(xiàn)文件中我們將兩個(gè)只讀屬性擴(kuò)展為可讀可寫這樣就可以調(diào)用其set方法,觸發(fā)KVO
  2. 我這邊創(chuàng)建了兩個(gè)Student分類,如果Student類的方法非常龐大,我們就可以以這種方式將各個(gè)不同功能的方法進(jìn)行分類,減小文件大小使類更加清晰;方法名均已ttt打頭,這是為了避免與原類中方法重名導(dǎo)致覆蓋,也借鑒了優(yōu)秀代碼SDWebImage的命名習(xí)慣
  3. 我在 class-continuation 分類聲明了三個(gè)方法,以p_打頭是為了告訴自己,這是一個(gè)私有方法,當(dāng)然也可以不用先聲明,直接實(shí)現(xiàn)即可,但是這種方式讓我隔斷時(shí)間再次看這樣的類的時(shí)候就會(huì)很快明白這個(gè)類是要干嘛的
  4. 關(guān)于調(diào)試:使用分類可以更快速的定位到錯(cuò)誤,上面例子中的call stack
極力推薦:

深入理解Objective-C:Category


希望會(huì)給大家?guī)?lái)幫助 O(∩_∩)O

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,431評(píng)論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,637評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,555評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,900評(píng)論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,629評(píng)論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,976評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,976評(píng)論 3 448
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,139評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,686評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,411評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,641評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,129評(píng)論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,820評(píng)論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,233評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,567評(píng)論 1 295
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,362評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,604評(píng)論 2 380

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,755評(píng)論 0 9
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 31,737評(píng)論 18 399
  • 第四章 協(xié)議與分類 Objective-C的“協(xié)議”(protocol)與java的“接口”類似。Objectiv...
    Code_Ninja閱讀 752評(píng)論 0 2
  • 【劉遠(yuǎn)莎:有個(gè)律師朋友是怎樣一種體驗(yàn)?】 劉遠(yuǎn)莎法律讀品 1、當(dāng)你把他介紹給你的小伙伴時(shí),大家會(huì)在第一時(shí)間認(rèn)定:他...
    小好閱讀 586評(píng)論 0 4
  • 汪秋水者,德惠之先輩詩(shī)人也。邇來(lái)《梅林三友集》付梓,始見稱于州縣,詩(shī)望有歸。予既慰其揚(yáng)名,復(fù)嘆其沒世,乃作此傳云。...
    金橘對(duì)芙蓉閱讀 517評(píng)論 0 1