標籤:
分類(Category 、Extension)(一)分類的劃分 (2) 1、(命名的類別)類別Category:只能添加新的方法,不能添加新變數。 2、(未命名的類別)類的擴充Extension://擴充一般直接寫在類的實現檔案中
//擴充中定義的都是類中私人的執行個體變數和方法
(二)分類的使用
(1)分類只能增加方法(包括類方法和對象方法),不能增加成員變數
(2)在分類方法的實現中可以訪問原來類中的成員變數;
(3)分類中可以重新實現原來類中的方法,但是會覆蓋掉原來的方法,導致原來的方法無法再使用(警告);
(4)方法調用的優先順序:分類->原來的類->父類,若包含有多個分類,則最後參與編譯的分類優先;
(5)在很多的情況下,往往是給系統內建的類添加分類,如NSObject和NSString,因為有的時候,系統類別可能並不能滿足我們的要求。
(6)在大規模的應用中,通常把相應的功能寫成一個分類,可以有無限個分類,對原有類進行擴充,一般分模組寫,一個模組一個分類。
//自訂的字串類String
1 // String.h 2 // 類別 3 // 4 // Created by ma c on 15/8/12. 5 // Copyright (c) 2015年 bjsxt. All rights reserved. 6 // 7 8 #import <Foundation/Foundation.h> 9 10 @interface String : NSObject11 @property(nonatomic,strong)NSString* string;12 -(id)initWithString:(NSString*) str;13 -(void)print;14 @end
1 // String.m 2 // 類別 3 // 4 // Created by ma c on 15/8/12. 5 // Copyright (c) 2015年 bjsxt. All rights reserved. 6 // 7 8 #import "String.h" 9 //#import "String_String_private.h"//在String類單獨匯入一個類擴充檔案10 11 //類擴充extension,添加的屬性str1和show方法都是私人的,只能在String類中可以訪問得到12 @interface String()//直接將類擴充檔案寫入String類的實現中13 {14 NSString *str1;15 }16 -(void)show;17 @end18 19 20 @implementation String21 -(id)initWithString:(NSString*) str22 {23 self = [super init];24 if(self)25 {26 _string = str;27 }28 return self;29 }30 -(void)show31 {32 NSLog(@"string is runing");33 }34 -(void)print//通過print方法訪問到類擴充中添加的屬性和方法35 {36 [self show];37 NSLog(@"%@",_string);38 }39 @end
//單獨的類擴充檔案
1 // String_String_private.h 2 // 類別 3 // 4 // Created by ma c on 15/8/12. 5 // Copyright (c) 2015年 bjsxt. All rights reserved. 6 // 7 8 #import "String.h" 9 10 @interface String ()11 {12 NSString *str1;13 }14 //@property(nonatomic,strong)NSString* str1;15 -(void)show;16 @end
//類別檔案
1 // String+Count.h 2 // 類別 3 // 4 // Created by ma c on 15/8/12. 5 // Copyright (c) 2015年 bjsxt. All rights reserved. 6 // 7 8 #import "String.h" 9 //String的類別Count,添加的方法,對String類進行功能的擴充(切記:類別中只能添加方法)10 @interface String (Count)11 -(NSInteger) nmuberOfString: (NSString *)str;12 -(NSInteger) numberOfCount: (NSString *)str;13 @end
1 // String+Count.m 2 // 類別 3 // 4 // Created by ma c on 15/8/12. 5 // Copyright (c) 2015年 bjsxt. All rights reserved. 6 // 7 8 #import "String+Count.h" 9 10 @implementation String (Count)11 -(NSInteger) nmuberOfString: (NSString *)str12 {13 NSInteger count = 0;14 for(int i=0;i<str.length;i++)15 {16 unichar ch = [str characterAtIndex:i];17 if(ch>=‘0‘ && ch<=‘9‘)18 count++;19 }20 return count;21 }22 -(NSInteger) numberOfCount: (NSString *)str23 {24 NSInteger count = 0;25 for(int i=0;i<str.length;i++)26 {27 unichar ch = [str characterAtIndex:i];28 if(ch>=‘0‘ && ch<=‘9‘)29 count++;30 }31 return count;32 }33 @end
//主函數測試
1 // main.m 2 // 類別 3 // 4 // Created by ma c on 15/8/12. 5 // Copyright (c) 2015年 bjsxt. All rights reserved. 6 // 7 8 #import <Foundation/Foundation.h> 9 #import "String+Count.h"10 #import "String.h"11 int main(int argc, const char * argv[])12 {13 @autoreleasepool14 {15 //測試類別擴充(未命名的類別) 關鍵字:extension16 String *string = [[String alloc]initWithString:@"xiayuan"];17 [string print];18 19 20 //測試類別(命名的類別) 關鍵字:Category21 NSInteger a = [string nmuberOfString:@"xu3984jjsn6ew32"];22 NSLog(@"a = %ld",a);23 24 NSInteger b = [string numberOfCount:@"36y3jfse93u4gdf8"];25 NSLog(@"b = %ld",b);26 }27 return 0;28 }
//運行結果
2015-08-12 15:24:06.281 類別[1304:75695] string is runing
2015-08-12 15:24:06.282 類別[1304:75695] xiayuan
2015-08-12 15:24:06.282 類別[1304:75695] a = 7
2015-08-12 15:24:06.282 類別[1304:75695] b = 7
Program ended with exit code: 0
Objective-C:分類(Category、extension)