iOS類別(Category)與擴展(Extension)

Category在iOS開發中使用非常頻繁。尤其是在爲系統類進行拓展的時候,我們可以不用繼承系統類,直接給系統類添加方法,最大程度的體現了Objective-C的動態語言特性。

#import

@interface NSObject (Category)

- (void)myMethod;

@end

這是一個最簡單的Category,作用於NSObject類,給NSObject添加了一個方法。

使用Category需要注意的點:

(1) Category的方法不一定非要在@implementation中實現,也可以在其他位置實現,但是當調用Category的方法時,依據繼承樹沒有找到該方法的實現,程序則會崩潰。

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

#import

static const void * externVariableKey =&externVariableKey;

@implementation NSObject (Category)

@dynamic variable;

- (id) variable

{

       return objc_getAssociatedObject(selfexternVariableKey);

}

- (void)setVariable:(id) variable

{

    objc_setAssociatedObject(selfexternVariableKeyvariable, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

—————————————————————————————–

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

@interface MyClass : NSObject 

@property (retain, readonly) float value; 

@end 

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

@interface MyClass () 

@property (retain, readwrite) float value; 

@end

使用Extension需要注意的點:

(1) Extension中的方法必須在@implementation中實現,否則編譯會報錯。

轉自:http://blog.sina.com.cn/s/blog_7ea0400d0101eyj6.html



注意事項

1:類別是類的擴展,只可以聲明方法,不可以聲明變量。並且,類別的方法優先級較高,可覆蓋原類方法。

2:類別的方法中,不可以調用super方法。–類別的侷限 

3:category 方法可能會覆蓋於同一個類class 的其它 category 中的方法。但也可能被覆蓋,因爲不法預知他們的加載優先順序,出現這種情況通常會在編譯時出錯。如果在一個開發的SDK中使用了類別, 就最好保證類別名不同於使用者的類別名, 以及類別方法也不同於使用者的類別方法名, 通常通過加前綴來做到。

使用類別:

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

2。 不想生成一個新的子類的情況下,比如對 NSArray 的擴展。

3。 方便做項目管理,可以將一份源碼在多個地方共享或者做方法版本管理、多人協作開發、用本地版本替換公共版本實現。

 

擴展:

某些情況下,我們需要聲明一個@property,它對外是隻讀的(readonly),而對內是可讀寫的(readwrite),這時,可以通過Extensions實現

// .h
@interface BaseClass : NSObject
@property (readonly) NSString *privateString; // 該.h文件對外公開
@end

// .m
@interface BaseClass()           // 該.m文件對外是不公開的, 當然這裏也可以放在專門的一個.h文件中,但同樣不把這個文件進行公開。
@property (readwrite) NSString *privateString;
@end

@implementation BaseClass
@synthesize privateString;
//...
@end

發佈了24 篇原創文章 · 獲贊 5 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章