天天看點

類别---category

@interface 已有類(類别名)

//方法定義

@end

定義類名時使用的類名必須是該項目中沒有的類,而定義類别時使用的類名必須是已有的類。

定義類别時必須使用圓括号來包含類别名

類别中通常指定義方法

@implmentation 已有類(類别名)

//方法實作

@end

例子:

@interface NSNumber (fk)

-(NSNumber*) add:(double) num2;

-(NSNumber*) substract:(double) num2;

-(NSNumber*) multiply:(double) num2;

-(NSNumber*) divide:(double) num2;

@end

#import "NSNumber+fk.h"

@implementation NSNumber(fk)

-(NSNumber*) add:(double) num2{

return [NSNumber numberWithDouble:([self doubleValue]+num2)];

};

-(NSNumber*) substract:(double) num2{

return [NSNumber numberWithDouble:([self doubleValue]+num2)];

];

-(NSNumber*) multiply:(double) num2{

return [NSNumber numberWithDouble:([self doubleValue]+num2)];

};

-(NSNumber*) divide:(double) num2{

return [NSNumber numberWithDouble:([self doubleValue]+num2)];];

@end

#import <Foundation/Foundation.h>

#import "NSNumbei+fk.h"

int main(int arg,char* argb[]){

@autoreleasepool{

NSNumber* num=[NSNumber numberWithInt: 3];

//至此 這個num對象可以調用添加的add/substract等方法。由于浮點數在底層存儲時存在精度丢失問題,是以輸出結果可能會存在差異。

}

return 0;

}

注意:在類别中也可以重寫原有類的方法。

通過類别為指定類添加新方法後,這個新方法不但會影響NSNumber本身,還會影響NSNumber類的所有子類,每個子類都會擷取到類别擴充的方法。

可根據實際需要給一個類定義多個類别,不同的類别都可以對原有類增加方法定義。

利用類别可以對類進行子產品化設計

利用類别可以調用私有方法

利用類别可以實作非正式協定

關于擴充:

@interface NSWindow(NSKeyboardUI)

@interface NSWindow(NSToolbarSupport)

@interface NSWindow(NSDrag)

關于調用私有方法

在類實作部分寫入接口部分沒有的方法時,數執行個體化的對象并不能調用該方法,若想使用該方法,則需要使用類别,如下

@import <Foundation/Foundation.h>

@interface Item: NSObject

@property (nonatomic,assign) double price;

-(void) info;

@end

#import "Item.h"

@implementation Item

@synthesize price;

-(void) info{

//方法體

}

-(double) discount:(double) count{

return self.price*count;

}

#import <Foundation/Foundation.h>

#import "Item.h"

int main(int arg,char* argv[]){

@autoreleasepool{

Item item=[[Item alloc] init];

//在此不能調用[item disount:2]方法。

}

return 0;

}

若果需要通路該方法

則需要聲明一個類别 該類别中具有discount方法

@interface Item(fk)

-(double) discount:(double) count;

@end

#import <Foundation/Foundation.h>

#import "Item+fk.h"

int main(int arg,char* argv[]){

@autoreleasepool{

Item item=[[Item alloc] init];

在此就可以調用[item disount:2]方法。

}

return 0;

}

iOS