類別與擴(kuò)展的區(qū)別

Category在iOS開發(fā)中使用非常頻繁。尤其是在為系統(tǒng)類進(jìn)行拓展的時(shí)候,我們可以不用繼承系統(tǒng)類,直接給系統(tǒng)類添加方法,最大程度的體現(xiàn)了Objective-C的動(dòng)態(tài)語言特性。

#import

@interface NSObject (Category)

- (void)myMethod;

@end

這是一個(gè)最簡(jiǎn)單的Category,作用于NSObject類,給NSObject添加了一個(gè)方法。

使用Category需要注意的點(diǎn):

(1) Category的方法不一定非要在@implementation中實(shí)現(xiàn),也可以在其他位置實(shí)現(xiàn),但是當(dāng)調(diào)用Category的方法時(shí),依據(jù)繼承樹沒有找到該方法的實(shí)現(xiàn),程序則會(huì)崩潰。

(2) Category理論上不能添加變量,但是可以使用@dynamic 來彌補(bǔ)這種不足。 (即運(yùn)行時(shí)Runtime)

#import

static const void * externVariableKey =&externVariableKey;

@implementation NSObject (Category)

@dynamic variable;

- (id) variable

{

return objc_getAssociatedObject(self, externVariableKey);

}

- (void)setVariable:(id) variable

{

objc_setAssociatedObject(self, externVariableKey, variable, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

-----------------------------------------------------------------------------------------

Extension非常像是沒有命名的類別。

@interface MyClass : NSObject

@property (retain, readonly) float value;

@end

//一般的時(shí)候,Extension都是放在.m文件中@implementation的上方。

@interface MyClass ()

@property (retain, readwrite) float value;

@end

使用Extension需要注意的點(diǎn):

(1) Extension中的方法必須在@implementation中實(shí)現(xiàn),否則編譯會(huì)報(bào)錯(cuò)。

轉(zhuǎn)自:http://blog.sina.com.cn/s/blog_7ea0400d0101eyj6.html

注意事項(xiàng)

1:類別是類的擴(kuò)展,只可以聲明方法,不可以聲明變量。并且,類別的方法優(yōu)先級(jí)較高,可覆蓋原類方法。

2:類別的方法中,不可以調(diào)用super方法。--類別的局限

3:category 方法可能會(huì)覆蓋于同一個(gè)類class 的其它 category 中的方法。但也可能被覆蓋,因?yàn)椴环A(yù)知他們的加載優(yōu)先順序,出現(xiàn)這種情況通常會(huì)在編譯時(shí)出錯(cuò)。如果在一個(gè)開發(fā)的SDK中使用了類別, 就最好保證類別名不同于使用者的類別名, 以及類別方法也不同于使用者的類別方法名, 通常通過加前綴來做到。

使用類別:

1。對(duì)框架提供類的擴(kuò)展(沒有源碼,不能修改)。

2。 不想生成一個(gè)新的子類的情況下,比如對(duì) NSArray 的擴(kuò)展。

3。 方便做項(xiàng)目管理,可以將一份源碼在多個(gè)地方共享或者做方法版本管理、多人協(xié)作開發(fā)、用本地版本替換公共版本實(shí)現(xiàn)。

擴(kuò)展:

某些情況下,我們需要聲明一個(gè)@property,它對(duì)外是只讀的(readonly),而對(duì)內(nèi)是可讀寫的(readwrite),這時(shí),可以通過Extensions實(shí)現(xiàn)

// .h

@interface BaseClass : NSObject

@property (readonly) NSString *privateString; // 該.h文件對(duì)外公開

@end

// .m

@interface BaseClass() // 該.m文件對(duì)外是不公開的, 當(dāng)然這里也可以放在專門的一個(gè).h文件中,但同樣不把這個(gè)文件進(jìn)行公開。

@property (readwrite) NSString *privateString;

@end

@implementation BaseClass

@synthesize privateString;

//...

@end

最后編輯于
?著作權(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)容

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,041評(píng)論 0 9
  • 一、導(dǎo)入js庫(kù) 注:<%=basePath%>表示項(xiàng)目根目錄 二、jQuery默認(rèn)校驗(yàn)規(guī)則 三、中文提示代碼 四、...
    moodTT閱讀 682評(píng)論 2 0
  • 文/一刀齋 許久未曾與人清談,今夜偶因字起,談玄為終,仿佛醍醐灌頂,心生了悟。 原是恰好臨了幾張字,興起放在社交平...
    一刀齋閱讀 451評(píng)論 0 6

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