類別

類別

  • 爲現有的類(自定義的類、第三方的類或者是系統定義的類)添加一些新的行爲
  • 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仍是隻讀的.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章