類別
- 爲現有的類(自定義的類、第三方的類或者是系統定義的類)添加一些新的行爲
- Objective-C的動態運行時的分配機制
- 爲現有類添加新的行爲,通常也可以採用創建子類的方法,但是它是有限制的,如現有的類你沒有源代碼,或者現有的類是以類簇的形式存在。都無法添加新的行爲。
- 不能爲現有類添加成員變量
- 類別的類的優先級都是極高的(沒有系統定義的高)
聲明和實現類別
- 類別代碼習慣放在獨立的文件中,通常會以”類名稱+類別名稱”的風格命名.這並不是硬性規定,而是一個好的習慣.如: NSString+NumberConvenience. 其含義是爲現有類 NSString 添加一個名爲 NumberConvenience 的類別
- 只要保證類別名唯一,可以像一個類中添加任意數量的類別.
- XCode 提供有創建類別的模板
聲明類別
@interface NSString (NSNumberConvience)
//爲現有的類(NSString)添加一個新的方法
- (NSNumber*)lenthAsNumber;
@end
這個聲明有兩個特點:
(1)現有的類位於@interface關鍵字之後,然後是位於括號中的類別名稱。
他表示:向NSString類中添加一個名稱爲NumberConvenience的類別
同名類別有唯一性,但是可以添加任意多的不同名類別
(2)可以執行希望向其添加類別的類以及類別的名稱,還可以列出添加的方法
不可以添加新的實例變量,類別生命中沒有實例變量部分
類別的實現
@implementation NSString (NSNumberConvience)
- (NSNumber*)lenthAsNumber
{
NSUInteger length = [self length];
return [NSNumber numberWithUnsignedLong:length];
}
@end
類別的優缺點
1.缺點
* 無法向類別中添加新的實例變量
* 名稱衝突. 注意:類別具有較高的優先級
2.優點
* 可以將類的實現代碼分散到多個不同的文件或框架中,方便一個大的工程的實現,有多個人來做屬於他的那一部分
* 創建對私有方法的前向引用
*向對象添加非正式協議
類別的擴展
- 沒有名字的類別
- 可以再源代碼類類裏使用
- 可以添加實例變量,作爲類的私有變量
- 可以將只讀權限改成可讀寫的權限
- 創建數量不限
下面舉一個例子,新建一個類 Things 繼承與超類 NSObject,頭文件內容如下:
#import <Foundation/Foundation.h>
@interface Things : NSObject
@property (assign) NSUInteger thing1;
@property (assign,readonly) NSUInteger thing2;
//thing2是隻讀的
- (void)resetAllValues;
- (void)print;
@end
在類的實現文件中代碼如下:
#import "Things.h"
//用沒有名字的類別, 來實現類的擴展
@interface Things ()
{
NSUInteger thing4;
}
@property(assign) NSUInteger thing3;
@property (assign,readwrite) NSUInteger thing2;
@end
@implementation Things
- (void)resetAllValues
{
self.thing1 = 100;
//正是因爲我們改變thing2屬性, 讓其成爲爲可讀寫的, 所以這裏纔可以給其賦值
self.thing2 = 200;
self.thing3 = 300;
thing4 = 400;
}
- (void)print
{
NSLog(@"%ld,%ld,%ld,%ld",self.thing1,self.thing2,self.thing3,thing4);
}
@end
在 main()中的代碼如下:
#import <Foundation/Foundation.h>
#import "Things.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Things *th = [[Things alloc] init];
// 雖然類擴展裏裏將thing2改成讀寫屬性, 但在外界面使用的時候, 還是主類的屬性
// th.thing2 = 200;
[th resetAllValues];
[th print];
}
return 0;
}
代碼的結果爲:100,200,300,400.
實現了對 readonly 的成員變量 thing2的值的改寫,但是只能在其類別的實現文件中改寫,在此外 thing2仍是隻讀的.