Categories可以為一個(gè)對(duì)象添加方法而不需要增加該類的子類或者更改當(dāng)前的對(duì)象。實(shí)際上Categories通常被用來為已經(jīng)存在的類添加方法,比如你可以自己為
NSString
字符串類添加你自己的方法榄笙。Categories provide the ability to add functionality to an object without subclassing or changing the actual object. A handy tool, they are often used to add methods to existing classes, such as
NSString
or your own custom objects.
優(yōu)點(diǎn)
- 提供一種簡單的方式俊卤,將類的定義模塊化到相關(guān)方法的組或分類中概页;
- 提供一種簡單的方式肾请,擴(kuò)展現(xiàn)有類定義枚尼,不必訪問類的源代碼贴浙,也無須創(chuàng)建子類。
舉例
Step1: 創(chuàng)建項(xiàng)目
啟動(dòng)Xcode -> File -> New -> Project. 然后創(chuàng)建一個(gè) iOS Single View Applciation署恍。這里我們命名為 Categories.
![](http://static.oschina.net/uploads/img/201205/13100357_ty74.png)
Step2: 創(chuàng)建Category
現(xiàn)在來創(chuàng)建一個(gè)Category來為NSString添加擴(kuò)展方法崎溃。點(diǎn)擊 File -> New -> File 然后選擇 Cocoa Touch Objective-C category. 這里我們命名為 RemoveNum。記得要從 Category on 下拉框選擇 NSString
盯质,最后點(diǎn)擊Create按鈕旁的Next按鈕袁串。
![](http://static.oschina.net/uploads/img/201205/13100358_2kXA.png)
聲明Category擴(kuò)展的方法。
選擇 "NSString+RemoveNums.h"文件呼巷。添加以下代碼:
@interface NSString (RemoveNums)//分類名放在圓括號(hào)中囱修,為`RomoveNums`
- (NSString *)removeNumbersFromString:(NSString *)string;
@end
實(shí)現(xiàn)Category擴(kuò)展的方法。
接著來到"NSString+RemoveNums.m"文件王悍。添加以下代碼破镰。大家可以看到這個(gè)方法實(shí)際做的事情就是從整個(gè)NSString
去除掉所有的數(shù)字字符。
- (NSString *)removeNumbersFromString:(NSString *)string
{
NSString *trimmedString = nil;
NSCharacterSet *numbersSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"];
trimmedString = [string stringByTrimmingCharactersInSet:numbersSet];
return trimmedString;
}
Step3: 導(dǎo)入Category
在"ViewController.h"文件頭部添加以下代碼來導(dǎo)入Category
#import "NSString+RemoveNums.h"
Step4: 測試Category
在 ViewController.h 文件的viewDidLoad
方法中添加以下代碼压储。
NSString *stringWithNums = @"ABC 123";
NSLog(@"stringWithNums --> %@",stringWithNums);
stringWithNums = [stringWithNums removeNumbersFromString:stringWithNums];
NSLog(@"trimmed stringWithNums --> %@",stringWithNums);
Step5: 使用Category的方法
在Xcode的菜單欄點(diǎn)擊 Product -> Run鲜漩,測試過程中,請(qǐng)注意控制臺(tái)首先輸出的ABC 123
渠脉,然后被方法去除數(shù)字后輸出的ABC
宇整。
![](http://static.oschina.net/uploads/img/201205/13100359_Po71.png)
關(guān)于Category的注意事項(xiàng)
- 分類可以覆寫該類中的另一個(gè)方法,但是通常認(rèn)為這種做法是拙劣的設(shè)計(jì)習(xí)慣芋膘。因?yàn)榱矍啵矊懥艘粋€(gè)方法后,再也不能訪問原來的方法为朋。如果確實(shí)需要覆寫方法臂拓,正確的選擇可能是創(chuàng)建子類。如果要在子類中覆寫方法习寸,仍然可以通過向super發(fā)送消息來引用父類的方法胶惰。因此不必了解要被覆寫方法的復(fù)雜內(nèi)容,就能夠調(diào)用父類的方法霞溪,并向子類的方法添加自己的功能孵滞。
- 如果喜歡可以擁有許多分類,只要遵守此處指出的規(guī)則即可鸯匹。如果一個(gè)方法定義在多個(gè)分類中坊饶,該語句不會(huì)指定使用哪個(gè)分類。
- 記住殴蓬,通過使用分類添加新方法來擴(kuò)展類不僅會(huì)影響這個(gè)類匿级,同時(shí)也會(huì)影響所有他的子類。例如,如果為根對(duì)象NSObject添加新方法痘绎,就存在潛在的危險(xiǎn)性津函,因?yàn)槊總€(gè)人都繼承這些新的方法,無論你是否愿意孤页。
- 通過分類為現(xiàn)有類添加新方法可能對(duì)你有用尔苦,但最好不要增加與該類的原始設(shè)計(jì)或意圖不一致的方法。
- 對(duì)象/分類命名對(duì)必須是唯一的散庶。但是蕉堰,在給定的Objective-C名稱空間中,只能存在一個(gè)NSString Name Utilities分類悲龟。
歡迎來我的個(gè)站逛逛: http://alexyu.me/