category
概念
category(分類)是Objective-C 2.0之后添加的語言特性,category的主要作用是為已經(jīng)存在的類(即使在沒有某個(gè)系統(tǒng)類源代碼的情況下)動(dòng)態(tài)添加方法返帕。除此之外撬腾,apple還推薦了category的另外兩個(gè)使用場景
- 可以把類的實(shí)現(xiàn)分開在幾個(gè)不同的文件里面熊榛。這樣做有幾個(gè)顯而易見的好處儿惫,a)可以減少單個(gè)文件的體積 b)可以把不同的功能組織到不同的category里 c)可以由多個(gè)開發(fā)者共同完成一個(gè)類 d)可以按需加載想要的category 等等末秃。
- 聲明私有方法
使用
創(chuàng)建一個(gè)分類后,生成一個(gè).m文件和一個(gè).h文件玩郊。在.h文件中聲明分類方法肢执,并在.m文件中實(shí)現(xiàn)。外界可以直接調(diào)用這個(gè)分類方法译红。
//為類 People 創(chuàng)建一個(gè)分類
//分類的.h 文件
#import "People.h"
@interface People (eat)
//聲明分類方法
- (void)eat;
@end
//分類的.m文件
#import "People+eat.h"
@implementation People (eat)
//實(shí)現(xiàn)分類方法
- (void)eat{
NSLog(@"吃飯");
}
@end
extension
概念
- Extension(類擴(kuò)展)是Category的一個(gè)特例预茄,其名字為匿名(為空)。
- extension在編譯期決議侦厚,它就是類的一部分耻陕,在編譯期和頭文件里的@interface以及實(shí)現(xiàn)文件里的@implement一起形成一個(gè)完整的類昵慌,它伴隨類的產(chǎn)生而產(chǎn)生,亦隨之一起消亡淮蜈。extension一般用來隱藏類的私有信息,你必須有一個(gè)類的源碼才能為一個(gè)類添加extension已卷,所以你無法為系統(tǒng)的類比如NSString添加extension梧田。
使用
創(chuàng)建一個(gè)類擴(kuò)展后,生成一個(gè).h文件侧蘸,在.h文件中聲明擴(kuò)展方法裁眯,然后在類的.m文件中實(shí)現(xiàn)擴(kuò)展方法。這個(gè)擴(kuò)展方法是一個(gè)私有方法讳癌,外界不可以調(diào)用穿稳。
//為類 People 創(chuàng)建一個(gè)擴(kuò)展
#import "People.h"
@interface People ()
//聲明擴(kuò)展方法
- (void)sleep;
@end
category 和 extension 的區(qū)別
- 相同點(diǎn):都可以為一個(gè)類添加方法
- 不同點(diǎn):
- 1、Categories在@implementation中不提供實(shí)現(xiàn)晌坤,編譯器不會(huì)報(bào)錯(cuò)逢艘,運(yùn)行調(diào)用時(shí)出錯(cuò);Extensions在@implementation中不提供實(shí)現(xiàn)骤菠,編譯器警告它改;
- 2、Category只能用于添加方法商乎,不能用于添加成員變量央拖。extension中聲明的方法和添加的成員變量是私有的,只有主implement能調(diào)用鹉戚,外部的類無法調(diào)用鲜戒。
- 3、Category 增加的方法如果與類的方法同名抹凳,會(huì)覆蓋原類的方法遏餐,因?yàn)镃ategory的優(yōu)先級(jí)更高!Extensions則會(huì)沖突報(bào)錯(cuò)却桶。