1.需求:如果對一個類在不更改代碼的基礎上要為它再擴充額外的方法可以使用繼承和分類
2.分類
作用:可以在不修改原來類代碼的基礎上,給某一個類擴充一些對象方法或者類方法,因此一個類可以有多個分類
實現:分類也是類因此也有聲明和實現,分類一般以要實現的功能或者模塊命名
聲明:@interface 類名(分類名稱) @end
實現:@implementation 類名(分類名稱) @end
3.注意
(1)在分類只能增加方法,不能增加成員變量,如果要增加成員變量的話該考慮用繼承去實現
(2)在分類實現方法中可以訪問類中的成員變量但是不能訪問類中的屬性@property
(3)在分類中可以重新實現原類中的方法,但會將原類中的方法覆蓋而失效。因為在執行對象成員方法的時候會優先去分類中查找,然後再去原類中去查找,最後去父類 中去查找。但是一般不建議麼做!
(4)如果一個類有多個分類,而且分類中有同名的方法那麼最後編譯的分類會將前面編譯的分類覆蓋而執行輸出
4.總結:
依據分類這一思想:如果一個類中有很多實現功能的方法,那麼可以將每一個功能方法單獨寫成分類,讓具體的分類來管理具體的功能!這樣的話如果其他類要實現同樣功能就可以直接調用分類
在實際開發中一般不建議給自定義的類寫分類,一般情況下都是為系統自帶的類寫分類
舉例:Peron類有兩個分類Person+QM 和 Person+MM
復制代碼
/*********************** Person.h文件 **********************************/
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
int _personCount;
}
@property int personCount;
- (void)test;
@end
復制代碼
復制代碼
/*********************** Person.m文件 **********************************/
#import "Person.h"
@implementation Person
- (void)test
{
NSLog(@"執行原類 Person 中的test方法");
}
@end
復制代碼
復制代碼
/*********************** Person+QM.h文件 **********************************/
#import "Person.h"
@interface Person (QQ)
- (void)study;
- (void)test;
@end
復制代碼
復制代碼
/*********************** Person+QM.m文件 **********************************/
#import "Person+QM.h"
@implementation Person (QQ)
- (void)study
{
NSLog(@"學習");
}
// 將原來Person的test覆蓋
- (void)test
{
NSLog(@"執行分類 Person+QM 中的test方法");
}
@end
復制代碼
復制代碼
/*********************** Person+MM.h文件 **********************************/
#import "Person.h"
@interface Person (MM)
- (void)test;
@end
復制代碼
復制代碼
/*********************** Person+MM.m文件 **********************************/
#import "Person+MM.h"
@implementation Person (MM)
- (void)test
{
NSLog(@"執行分類 Person+MM.h 中的test方法");
}
@end
復制代碼
復制代碼
/*********************** main.m文件 **********************************/
#import <Foundation/Foundation.h>
#import "Person+QM.h"
#import "Person.h"
int main(int argc, const char * argv[])
{
Person *person = [[Person alloc] init];
[person test];
[person study];
return 0;
}
復制代碼
輸出:
2014-03-06 14:07:04.281 分類[898:303] 執行分類 Person+QM 中的test方法
2014-03-06 14:07:04.282 分類[898:303] 學習
為什麼會輸出分類Person+QM中的方法呢,這個和編譯順序有關系