1、分類的概念
在不改變原有類的情況下,給原有類添加方法
【Category】是OC特有的語法,其他語言沒有。類似於C#中的擴展方法和partial關鍵字。
【實質】一些方法的聲明和實現
2、作用
1)在不修改原有類的基礎上增加新的方法
2)一個龐大的類可以分模塊開發
3)一個龐大的類可以有多個人來編寫,更利於團隊合作
3、使用分類的目的
1)對現有類進行擴展
2)作爲子類的替代手段
不需要定義和使用一個子類,可以通過類別直接想已有的類增加方法
3)對類中的方法歸類
利用category把一個龐大的類劃分爲小塊進行開發,從而更好的對類中的方法進行更新和維護。
4、使用分類的步驟
先聲明分類-->實現分類--->使用分類
【注意】分類的命名規則:類名+擴展方法:如:“NSString+countNum”
分類的接口聲明與類的定義十分相似,但分類不繼承父類,只需要帶有一個括號,表明該分類的主要用途。
【聲明一個分類】
格式:
@interface 待擴展類名 (分類名稱)
【實現分類】
@implementation 待擴展類名 (分類名稱)
【調用類別中的方法】
與一般成員方法調用形式完全一樣。【需要包含類別的頭文件】
5、使用注意事項
1、分類只能增加方法方法,不能增加成員變量
1)在分類中不能聲明實例變量
2)也不能使用@property
2、分類可以訪問原來類的成員變量
3、如果分類中方法與原類中方法同名,優先調用分類中方法
4、在多個類別中有同名的方法時,【執行最後編譯的那個類別中的同名方法】
6、分類使用舉例
【Person.h文件內容】
#import <Foundation/Foundation.h>
#pragma mark Person 類聲明部分
@interface Person : NSObject{
int _age;
NSString *_name;
}
@property(nonatomic,assign) int age;
@property(nonatomic,strong) NSString *name;
-(void) eat;
@end
【Person+base.h文件內容】
#pragma mark Person 分類聲明部分
@interfacePerson(base)
//int sex;//這樣會在編譯時報錯
//@property int sex;//編譯時不報錯,但是使用sex時會報錯(如p.sex = 1),找不到setSex方法
//聲明擴展的方法
-(void) eat;
-(void)run;
@end
【Person.m文件內容】
#pragma mark Person 類實現部分
@implementation Person
-(void) eat{
NSLog(@"Person eat food....");
}
@end
【Person+base.m文件內容】
#pragma mark Person 分類實現部分
@implementation Person(base)
-(void)eat{
//分類中可以調用原類中的成員變量
NSLog(@"%@ eat food....",self.name);
}
-(void)run{
NSLog(@"%@ run....",self.name);
}
@end
【main.m文件內容】
#import "Person.h"
#import "Person+base.h" //分類頭文件也要引入
int main(int argc, const char * argv[])
{
@autoreleasepool {
Person *p = [Person new];
p.name = @"Amos";
//Person類對象可以調用分類中的方法,就跟調用原有類中的一樣
[p run];
//Person類與其分類中有同名方法,優先調用分類中的方法
[p eat];
}
return 0;
}
【打印結果】
2015-10-07 09:54:09.439 加強02[616:303] Amos run....
2015-10-07 09:54:09.441 加強02[616:303] Amos eatfood....