#import
@interface NSObject (Category)
- (void)myMethod;
@end
這是一個最簡單的Category,作用於NSObject類,給NSObject添加了一個方法。
使用Category需要注意的點:
(1) Category的方法不一定非要在@implementation中實現,也可以在其他位置實現,但是當調用Category的方法時,依據繼承樹沒有找到該方法的實現,程序則會崩潰。
(2) Category理論上不能添加變量,但是可以使用@dynamic
#import
static const void * externVariableKey
@implementation
@dynamic variable;
- (id) variable
{
}
- (void)setVariable:(id) variable
{
}
—————————————————————————————–
Extension非常像是沒有命名的類別。
@interface MyClass : NSObject
@property (retain, readonly) float value;
@end
//一般的時候,Extension都是放在.m文件中@implementation的上方。
@interface MyClass ()
@property (retain, readwrite) float value;
@end
使用Extension需要注意的點:
(1)
轉自: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