1:分類的使用場景:想對一個類,擴充一些功能,而又不改變原來類的模型,也不用繼承,這時OC中的特有文法:分類可以做到;
當然分類也是一個類,也需要聲明和實作,聲明在.h檔案中,實作在.m檔案中,格式如下
// 聲明
@interface 類名 (分類名稱)
@end
// 實作
@implementation 類名 (分類名稱)
2:分類的好處,當一個類比較龐大時,不同的部分可以放到不同的分類中,也友善團隊中類的開發;
3:分類使用注意:
a:分類不能增加成員變量,隻能對原類增加方法;
b:分類方法實作中,可以通路原來類的成員變量;
c:分類可以寫和類同名的方法,但是這樣會覆寫掉原來類的方法,導緻永遠通路不到原來的類的方法,是以不建議這麼做;
調用順序:分類——找不到方法時去——>原來類——找不到方法時去——>父類;可見分類的調用優先級最高;
d:當一個類有單個分類時,且每個分類都由同名方法,調用順序和編譯的順序有關,最後編譯的方法會覆寫先編譯的方法,是以最後編譯的會被調用;
分類的應用:給NSString增加方法,計算一個字元串中數字的個數;
// 在NSString+intSum.h檔案中
// 對NSString類添加一個類方法和對象方法,計算字元串中整數的個數;
#import <Foundation/Foundation.h>
@interface NSString (intSum)
//對NSString類添加一個類方法,計算字元串中整數的個數,聲明
+ (int)intSum:(NSString *)str;
// 對象方法的聲明
- (int)intCount;
@end
// 在NSString+intSum.m檔案中
@implementation NSString (intSum)
// 類方法的實作
+ (int)intSum:(NSString *)str
{
int count = 0;
for (int i = 0; i<str.length; i++) {
int temp = [str characterAtIndex:i];
if (temp > '0' && temp < '9') {
count++;
}
}
return count;
}
// 對象方法的實作,隻需調用類方法就可以了;
- (int)intCount
{
return [NSString intSum:self];
}
@end
// 在main中測試
int main()
{
int sum = [NSString intSum:@"234df56"]; // 調用類方法
int count = [@"234sd454545" intCount]; // 調用對象方法
NSLog(@"sum=%d, count=%d", sum, count);
return 0;
}