類(lèi)別(category)——通過(guò)使用類(lèi)別频轿,我們可以動(dòng)態(tài)地為現(xiàn)有的類(lèi)添加新方法逆日,而且可以將類(lèi)定義模塊化地分不到多個(gè)相關(guān)文件中。通常只在類(lèi)別中定義方法颖侄。
類(lèi)別鸟雏,接口部分的定義,通常該文件命名為已有"類(lèi)+類(lèi)別名.h"
@interface 已有類(lèi) (類(lèi)別名)
//.......方法實(shí)現(xiàn)
@end
例如享郊,考慮為NSNumber增加一個(gè)類(lèi)別,則接口部分代碼如下
#import <Foundation/Foundation.h>
@interface NSNumber (code)
-(NSNumber *) add:(double) num;
-(NSNumber *) mult:(double) num
@end
該類(lèi)別的實(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類(lèi)的實(shí)例就都會(huì)具有add:孝鹊、multi:方法炊琉,從而實(shí)現(xiàn)對(duì)NSNumber類(lèi)的動(dòng)態(tài)擴(kuò)展。
PS.如果一個(gè)函數(shù)在.h文件中無(wú)聲明而在.m文件中定義它的實(shí)現(xiàn)又活,那么該方法就是私有方法苔咪,只能在本類(lèi)的文件中使用。 若我們?cè)陬?lèi)別的借口部分聲明這個(gè)方法柳骄,那么我們就可以實(shí)現(xiàn)對(duì)該私有方法的訪問(wèn)团赏。
擴(kuò)展(extension)
擴(kuò)展與類(lèi)別相似,擴(kuò)展相當(dāng)于匿名類(lèi)別耐薯,即沒(méi)有類(lèi)別名得類(lèi)別
在用法上舔清,類(lèi)別通常都都有單獨(dú)的.h和.m文件。擴(kuò)展則是臨時(shí)的對(duì)某個(gè)類(lèi)進(jìn)行擴(kuò)展曲初,類(lèi)的實(shí)現(xiàn)部分同時(shí)實(shí)現(xiàn)類(lèi)接口部分定義的方法和擴(kuò)展中定義的方法体谒。定義類(lèi)的擴(kuò)展時(shí),可以增加額外的實(shí)例變量臼婆,也可使用@property和@synthesize關(guān)鍵字抒痒,但在定義類(lèi)的額外列表時(shí)不允許額外定義實(shí)例變量。
有類(lèi)名為Vehicle颁褂,只有name屬性沒(méi)有定義方法故响。對(duì)其進(jìn)行擴(kuò)展。為原來(lái)的Vehicle類(lèi)增加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(@"交通工具名稱(chēng)%@,顏色屬性%@",_name,_color);
}
@end
QQ20160308-2@2x.png
協(xié)議(protocol)
以NSObject為基礎(chǔ),為NSOject創(chuàng)建類(lèi)別奖唯,創(chuàng)建類(lèi)別時(shí)指定該類(lèi)新增的方法惨缆,既可以實(shí)現(xiàn)非正式協(xié)議。而OC中對(duì)于實(shí)現(xiàn)非正式協(xié)議的類(lèi)而言丰捷,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é)議的語(yǔ)法如下:
@interface 類(lèi)名:父類(lèi)型 <協(xié)議1停巷, 協(xié)議2...>
使用協(xié)議來(lái)定義變量耍攘,那么這些變量只能調(diào)用該協(xié)議中聲明的方法榕栏,否則編譯器會(huì)提示錯(cuò)誤。
協(xié)議體現(xiàn)的是一種規(guī)范蕾各,定義協(xié)議的類(lèi)可以把協(xié)議定義的方法委托(delegate)給實(shí)現(xiàn)協(xié)議的類(lèi)扒磁,這樣可以讓類(lèi)具有更好的通用性,具體的動(dòng)作交給協(xié)議的實(shí)現(xiàn)類(lèi)來(lái)完成式曲。在大量的應(yīng)用程序開(kāi)發(fā)中大量依賴委托這個(gè)概念妨托。