標籤:
1.為什麼要有類別?在現有類的基礎上做擴充,可以採用繼承和組合兩種方法來實現,但是OC為什麼還要有類別這種方式呢?
想想這樣一個應用情境,要建立一個字典,key是字串,value是字串的長度。一般的做法是:
NSMutableDictionary *dict = [NSMutableDictionary dictionary]; NSString* str = @"hello"; NSNumber* num1 = [NSNumber numberWithUnsignedInt:[str length]]; [dict setObject:num1 forKey:str]; str = @"world"; num1 = [NSNumber numberWithUnsignedInt:[str length]]; [dict setObject:num1 forKey:str]; NSLog (@"%@", dict);
由於NSMutableDictionary儲存的key-value必須是OC對象,不能儲存int等基本的c語言類型,所以上面dict中對象value長度必須是NSNumber類型,每儲存一個長度都得調用NSNumber* num1 = [NSNumber numberWithUnsignedInt:[str length]]這行重複代碼,類別就可以用來解決這類問題。
另外對於一些沒有源碼的類,比如NSString類,從NSString繼承是一個很糟糕的選擇,因為你無法知道NSString內部是怎麼實現的,NSString會根據不同的初始化內部建立不同的對象,類別能解決這個問題。
2.類別個人感覺就像C裡面的全域函數一樣,比如上面的例子,可以傳入一個長度,返回一個NSNumber*對象。類型的聲明方法:在類的後面加入類別名稱並且用括弧括起來。
@interface NSString (NumberConvenience)
- (NSNumber *)lengthAsNumber;
@end
NumberConvenience實現很簡單
@implementation NSString (NumberConvenience)- (NSNumber *)lengthAsNumber{ NSUInteger length = [self length]; return ([NSNumber numberWithUnsignedInt:length]);} // lengthAsNumber@end
利用協議解決1中重複代碼問題如下:
NSMutableDictionary *dict = [NSMutableDictionary dictionary]; NSString* str = @"hello"; [dict setObject:[str lengthAsNumber] forKey:str]; str = @"world"; [dict setObject:[str lengthAsNumber] forKey:str]; NSLog (@"%@", dict);
代碼清爽簡單多了!!!!
3.類別優缺點。
類別缺陷:1)無法新增成員變數 2)容易造成名字衝突。當名字衝突的時候類別中的方法具有高優先順序,他將覆蓋其他同名名字變成可見的。
類別優點:1)可以將實現代碼分散到不同檔案或者架構裡面去。2)建立對私人方法的引用 3)向對象添加非正式協議(informal protocol)
Objective-C基礎6 : 類別category