在開發項目的過程中,有時候需要爲已有的類擴展一些新的行爲,對於這種擴展方式,最容易想到的就是使用繼承。通過繼承,子類可以在父類的基礎上添加新的方法,甚至重寫父類已有的方法。除了繼承之外,分類可以在不改變原來類內容的基礎上,爲類增加一些方法。
1 分類
分類的語法格式爲:
1、分類的聲明:
@interface 類名 (分類名稱)
// 方法聲明
@end
2、分類的實現:
@implementation 類名 (分類名稱)
// 方法實現
@end
在聲明部分,分類只能增加方法,不能增加成員變量;分類方法實現中可以訪問主類中聲明的成員變量。
//Person.h
@interface Person : NSObject
{
int _age;
}
@property int age;
- (void)test;
@end
//Person.m
@implementation Person
- (void)test
{
NSLog(@"Person-test");
}
@end
//Persn的分類,Person+JJ.h
@interface Person (JJ)
- (void)test2;
@end
//Persn的分類,Person+JJ.m
@implementation Person (JJ)
- (void)test2 //實現分類中聲明的方法
{
_age = 10; //訪問主類的成員變量
NSLog(@"-----test2,age=%d",_age);
}
- (void)test //分類中重新實現主類中的test方法,將會覆蓋主類中的test方法,導致主類的方法無法使用
{
NSLog(@"Person (JJ)-test");
}
@end
如上文的程序所示,分類中重新重新實現主類中的test方法,將會覆蓋主類中的test方法,更特別的時,如果多個分類都重新實現了主類的某一個方法,則該方法將由最後參與編譯的分類調用。即方法調用的優先級:分類(最後參與編譯的分類優先) --> 原來類(主類) --> 父類。2 分類的應用
分類的應用,給NSString增加一個類方法:計算某個字符串中阿拉伯數字的個數; 給NSString增加一個對象方法:計算當前字符串中阿拉伯數字的個數。
//NSString+Number.h
@interface NSString (Number)
+ (int)numberCountOfString:(NSString *)str;
- (int)numberCount;
@end
//NSString+Number.m
@implementation NSString (Number)
+ (int)numberCountOfString:(NSString *)str
{
return [str numberCount];
}
- (int)numberCount
{
int count = 0;
unichar = c = [self characterAtIndex:i];
for (int i = 0; i='0' && c<='9' )
{
count++;
}
}
return count;
}
//main.c
int main()
// 類庫:很多類的集合
{
int count1 = [NSString numberCountOfString:@"54d4df3a43sdf43dasd"];
int count2 = [@"9fdsdffds54df3543" numberCount];
NSLog(@"%d", count1);
NSLog(@"%d", count2);
return 0;
}
@end
3 總結分類的作用:在不改變原來類內容的基礎上,可以爲類增加一些方法
使用注意:
1.分類只能增加方法,不能增加成員變量
2.分類方法實現中可以訪問原來類中聲明的成員變量
3.分類可以重新實現原來類中的方法,但是會覆蓋掉原來的方法,會導致原來的方法沒法再使用
4.方法調用的優先級:分類(最後參與編譯的分類優先) --> 原來類 --> 父類
iOS,Android,Java培訓,期待與您的交流