類別(category)——通過使用類別,我們可以動(dòng)態(tài)地為現(xiàn)有的類添加新方法,而且可以將類定義模塊化地分不到多個(gè)相關(guān)文件中。通常只在類別中定義方法。
類別,接口部分的定義,通常該文件命名為已有"類+類別名.h"
@interface 已有類 (類別名)
//.......方法實(shí)現(xiàn)
@end
例如,考慮為NSNumber增加一個(gè)類別,則接口部分代碼如下
#import <Foundation/Foundation.h>
@interface NSNumber (code)
-(NSNumber *) add:(double) num;
-(NSNumber *) mult:(double) num
@end
該類別的實(shí)現(xiàn)部分如下
#import "NSNumber+code.h"
@implementation NSNumber (code)
-(NSNumber *) add:(double) num
{
return [NSNumber numberWithDouble:([self doubleValue] +num)];
}
-(NSNumber *) mult:(double) num
{
return [NSNumber numberWithDouble:([self doubleValue] +num)];
}
@end
所有NSNumber類的實(shí)例就都會(huì)具有add:、multi:方法,從而實(shí)現(xiàn)對(duì)NSNumber類的動(dòng)態(tài)擴(kuò)展。
PS.如果一個(gè)函數(shù)在.h文件中無聲明而在.m文件中定義它的實(shí)現(xiàn),那么該方法就是私有方法,只能在本類的文件中使用。 若我們?cè)陬悇e的借口部分聲明這個(gè)方法,那么我們就可以實(shí)現(xiàn)對(duì)該私有方法的訪問。
擴(kuò)展(extension)
擴(kuò)展與類別相似,擴(kuò)展相當(dāng)于匿名類別,即沒有類別名得類別
在用法上,類別通常都都有單獨(dú)的.h和.m文件。擴(kuò)展則是臨時(shí)的對(duì)某個(gè)類進(jìn)行擴(kuò)展,類的實(shí)現(xiàn)部分同時(shí)實(shí)現(xiàn)類接口部分定義的方法和擴(kuò)展中定義的方法。定義類的擴(kuò)展時(shí),可以增加額外的實(shí)例變量,也可使用@property和@synthesize關(guān)鍵字,但在定義類的額外列表時(shí)不允許額外定義實(shí)例變量。
有類名為Vehicle,只有name屬性沒有定義方法。對(duì)其進(jìn)行擴(kuò)展。為原來的Vehicle類增加color屬性和drive:方法,因此在Vehicle.m實(shí)現(xiàn)文件里面要實(shí)現(xiàn)Vehicle.h里聲明的方法及這個(gè)drive:方法。
//"Vehicle.m"
#import "Vehicle.h"
@interface Vehicle ()
@property(nonatomic, strong) NSString *color;
-(void) drive:(NSString *)name;
@end
@implementation Vehicle
-(void) drive:(NSString *)name
{
NSLog(@"交通工具名稱%@,顏色屬性%@",_name,_color);
}
@end
QQ20160308-2@2x.png
協(xié)議(protocol)
以NSObject為基礎(chǔ),為NSOject創(chuàng)建類別,創(chuàng)建類別時(shí)指定該類新增的方法,既可以實(shí)現(xiàn)非正式協(xié)議。而OC中對(duì)于實(shí)現(xiàn)非正式協(xié)議的類而言,OC并不強(qiáng)制實(shí)現(xiàn)該協(xié)議中的所有方法 。
正式協(xié)議使用@protocol關(guān)鍵字定義
@protocol 協(xié)議名 <父協(xié)議1, 父協(xié)議2>
{
//.....方法聲明
}
@end
協(xié)議是支持多繼承的。在OC2.0標(biāo)準(zhǔn)中新增了@required@optional兩個(gè)關(guān)鍵字,聲明方式是必須是必須實(shí)現(xiàn)還是可選的,默認(rèn)為@required.
遵守協(xié)議的語法如下:
@interface 類名:父類型 <協(xié)議1, 協(xié)議2...>
使用協(xié)議來定義變量,那么這些變量只能調(diào)用該協(xié)議中聲明的方法,否則編譯器會(huì)提示錯(cuò)誤。
協(xié)議體現(xiàn)的是一種規(guī)范,定義協(xié)議的類可以把協(xié)議定義的方法委托(delegate)給實(shí)現(xiàn)協(xié)議的類,這樣可以讓類具有更好的通用性,具體的動(dòng)作交給協(xié)議的實(shí)現(xiàn)類來完成。在大量的應(yīng)用程序開發(fā)中大量依賴委托這個(gè)概念。