本章節(jié)暫時沒有g(shù)et到重點知識,待溫故知新的那一刻。
待更新儡遮。坑鱼。。残吩。
###Category
首先我們來談談Category。
Objective-C提供了一種與眾不同的方式——Catagory,可以動態(tài)的為已經(jīng)存在的類添加新的行為蛤虐。這樣可以保證類的原始設計規(guī)模較小,功能增加時再逐步擴展肝陪。使用Category對類進行擴展時驳庭,不需要訪問其源代碼,也不需要創(chuàng)建子類氯窍。Category使用簡單的方式饲常,實現(xiàn)了類的相關(guān)方法的模塊化,把不同的類方法分配到不同的分類文件中狼讨。
實現(xiàn)起來很簡單贝淤,我們舉例說明。
SomeClass.h
@interface SomeClass : NSObject{
}
-(void) print;
@end
這是類SomeClass的聲明文件政供,其中包含一個實例方法print播聪。如果我們想在不修改原始類、不增加子類的情況下布隔,為該類增加一個hello的方法离陶,只需要簡單的定義兩個文件SomeClass+Hello.h和SomeClass+Hello.m,在聲明文件和實現(xiàn)文件中用“()”把Category的名稱括起來即可衅檀。聲明文件代碼如下:
#import "SomeClass.h"
@interface SomeClass (Hello)
-(void)hello;
@end
實現(xiàn)文件代碼如下
#import "SomeClass+Hello.h"
@implementationSomeClass (Hello)
-(void)hello{
NSLog (@"name:%@ ", @"Jacky");
}
@end
其中Hello是Category的名稱招刨,如果你用XCode創(chuàng)建Category,那么需要填寫的內(nèi)容包括名稱和要擴展的類的名稱哀军。這里還有一個約定成俗的習慣沉眶,將聲明文件和實現(xiàn)文件名稱統(tǒng)一采用“原類名+Category”的方式命名。
調(diào)用也非常簡單排苍,毫無壓力沦寂,如下: 首先引入Category的聲明文件,然后正常調(diào)用即可淘衙。
#import "SomeClass+Hello.h"
SomeClass * sc =[[SomeClass alloc] init];
[sc hello]
執(zhí)行結(jié)果是:
name:Jacky
Category的使用場景:
當你在定義類的時候传藏,在某些情況下(例如需求變更),你可能想要為其中的某個或幾個類中添加方法。
一個類中包含了許多不同的方法需要實現(xiàn)毯侦,而這些方法需要不同團隊的成員實現(xiàn)
當你在使用基礎類庫中的類時哭靖,你可能希望這些類實現(xiàn)一些你需要的方法。
遇到以上這些需求侈离,Category可以幫助你解決問題试幽。當然,使用Category也有些問題需要注意卦碾,
Category可以訪問原始類的實例變量铺坞,但不能添加變量,如果想添加變量洲胖,可以考慮通過繼承創(chuàng)建子類济榨。
Category可以重載原始類的方法,但不推薦這么做绿映,這么做的后果是你再也不能訪問原來的方法擒滑。如果確實要重載,正確的選擇是創(chuàng)建子類叉弦。
和普通接口有所區(qū)別的是丐一,在分類的實現(xiàn)文件中可以不必實現(xiàn)所有聲明的方法,只要你不去調(diào)用它淹冰。
用好Category可以充分利用Objective-C的動態(tài)特性库车,編寫出靈活簡潔的代碼。