Objective-c中提供了可以讓我們擴(kuò)展類定義的手段:類目懒棉,延展和協(xié)議贪婉。類目:為已知的類增加新的方法逃沿;延展:通知在本類的定義里使用類目來聲明私有方法烫幕;協(xié)議:協(xié)議聲明了可以被任何類實(shí)現(xiàn)的方法妆棒。
1.類目(類別 category)
1)聲明類目
@interface TestModel (newModel)
-(void)newFun;
@end
該聲明具有2個特點(diǎn)澡腾。首先,現(xiàn)有類位于@interface關(guān)鍵字之后糕珊,其后是位于圓括號中的一個新名稱动分。該聲明表示,類別的名稱是newModel红选,而且該類別將向TestModel類中添加方法澜公。只要保證類別名稱的唯一性,你可以向一個類中添加任意多得類別喇肋。你可以指定希望向其添加類別的類以及類別的名稱坟乾,而且你還可以列出添加的方法,最后以@end結(jié)束蝶防。由于不能添加新實(shí)現(xiàn)變量甚侣,因此與類聲明不同的是,類別的聲明中沒有實(shí)例變量部分和屬性间学,但是分類可以訪問原來類中的成員變量殷费。
類目的局限性
一,無法向類中添加新的實(shí)例變量,屬性,類別沒有位置容納實(shí)例變量低葫。
二详羡,名稱沖突,即類別中得方法與現(xiàn)有的方法重名嘿悬。當(dāng)發(fā)生名稱沖突時(shí)实柠,類別具有更高的優(yōu)先級。你得類別方法將完全取代初始方法善涨,從而無法再使用初始方法窒盐。因此在自己的類別方法中增加一個前綴草则,以確保不發(fā)生名稱沖突。
(可以有一些方法像類別中添加屬性登钥,如下圖)
類目的作用
類別主要用于三個目的:第一畔师,將類的實(shí)現(xiàn)分散到不同文件或者不同框架中。第二牧牢,創(chuàng)建對私有方法的前向引用看锉。第三,向?qū)ο筇砑臃钦絽f(xié)議
延展(extension)
類的延展可以看作是一種匿名的類目塔鳍,類有時(shí)需要一些只為自己所見伯铣,所用的私有方法這種私有方法可以通過延展的方式來聲明,延展中定義的方法在類本身的@implementation代碼區(qū)域中進(jìn)行實(shí)現(xiàn)轮纫。
@interface MyOb : NSObject
{
NSNumber *num;?
}
- (NSNumber *)num;
@end?
@interface MyOb(Set)
- (void)setNum:(NSNumber *)newNum;
@end
@implementation MyOb
- (NSNumber *)num
{
return num;
}
- (void)setNum:(NSNumber *)newNum
{
//do some thing
}
@end
當(dāng)在定義延展的時(shí)候不提供類目名時(shí)腔寡,延展中定義的方法既被視為“必須實(shí)現(xiàn)”的API在這種情況下掌唾,如果方法缺少實(shí)現(xiàn)代碼,則編譯器會報(bào)警告凭语,此時(shí)方法的實(shí)現(xiàn)必須出現(xiàn)在類主體的@implementation代碼塊中似扔,延展沒有自己的.m文件搓谆,必須在原類.m中實(shí)現(xiàn)方法。
xcode中添加 類別和延展
協(xié)議和代理模式
協(xié)議只聲明了方法,不具體實(shí)現(xiàn)螃诅,接受協(xié)議的對象負(fù)責(zé)實(shí)現(xiàn)。OC的協(xié)議是由@protocol聲明的一組方法列表,要求其它的類去實(shí)現(xiàn)亭枷,相當(dāng)于@interface部分的聲明叨粘。
注意:
a.確認(rèn)協(xié)議時(shí)應(yīng)實(shí)現(xiàn)協(xié)議中 @required 修飾的方法
b.可以選擇性實(shí)現(xiàn) @optional 修飾的方法
c.使用[對象 conformsToProtocol:@protocol(Protocol)]判斷是否遵循協(xié)議
d.協(xié)議寫在提供協(xié)議類的.h文件里
協(xié)議的應(yīng)用--代理
代理模式即本身不做時(shí)間的事情,而是要求其他人去做答倡。
category和extension用來做類擴(kuò)展的,可以對現(xiàn)有類擴(kuò)展功能或者修改其功能获茬。
在iOS中category應(yīng)用是非常廣泛的倔既,系統(tǒng)自帶的很多類都有多個category擴(kuò)展功能渤涌。
一般category中可以定義新的方法、重寫類原來的方法和添加readonly屬性
而extension可以認(rèn)為是匿名的category实蓬,但是這個extension相對于category有有一個特殊功能:
在extension中可以定義可寫的屬性安皱,公有可讀练俐、私有可寫的屬性(Publicly-Readable, Privately-Writeable Properties)一般這樣實(shí)現(xiàn)!