@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;
}