---------------------------------------- android培訓、java培訓、期待與您交流! -----------------------------------------
一、 使用場景
繼承
分類(Category)
二、 主要作用
1. 在不創建繼承類的情況下實現對已有類的擴展。
2. 簡化類的開發工作(當一個類需要多個程序員協同開發的時候,Category可以將同一個類根據用途分別放在不同的源文件中,從而便於程序員獨立開發相應的方法集合)。
3. 將常用的相關的方法分組。
4. 在沒有源代碼的情況下可以用來修復BUG。
三、 用法格式
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property int age;
- (void)test;
@end
2、原來Person類的.m實現文件#import "Person.h"
@implementation Person
- (void)test
{
NSLog(@"Person-test");
}
@end
3、分類的聲明
@interface 類名 (分類名稱)
// 方法聲明
@end
#import "Person.h"
@interface Person (COCO)
- (void)testDemo;
@end
4、分類的實現
@implementation 類名 (分類名稱)
// 方法實現
@end
#import "Person+COCO.h"
@implementation Person (COCO)
- (void)testDmeo
{
NSLog(@"!!!----testDmeo");
}
@end
總結:聲明通常是在.h文件中,然後我們在.m文件中實現這些方法,格式如上:
四、分類的好處
1、一個龐大的類可以分模塊開發
2、一個龐大的類可以由多個人來編寫,更有利於團隊合作
五、 給系統自帶的類添加分類(當系統類方法不夠用的時候)
1、給NSString增加一個類方法:計算某個字符串中阿拉伯數字的個數
PS :由於類方法和對象方法很類似。可以先實現對象方法,之後在類方法裏面調用對象方法,實現代碼的簡化。
2、給NSString增加一個對象方法:計算當前字符串中阿拉伯數字的個數,代碼如下:
1)聲明:NSString+Number.h
#import <Foundation/Foundation.h>
@interface NSString (Number)
- (int)numberCount;
@end
2)實現:NSString+Number.m
#import "NSString+Number.h"
@implementation NSString (Number)
// @"abc434ab43"
- (int)numberCount
{
int count = 0; //定義變量計算數字的個數
for (int i = 0; i<self.length; i++) //遍歷字符串所有字符
{
// 取出i這個位置對應的字符
unichar c = [self characterAtIndex:i];
// 如果這個字符是阿拉伯數字
if ( c>='0' && c<='9' ) //if ( c>='0' && c<='9' )
{
count++; // 變量數字累加
}
}
return count; // 返回變量數字
}
@end
3)main.m
#import <Foundation/Foundation.h>
#import "NSString+Number.h"
int main()
// 類庫:很多類的集合
{
//直接調用字符串對象的numberCount的方法,比類方法更面向對象,建議用這種方法
int count = [@"9fdsfds543543" numberCount];
NSLog(@"%d", count);
return 0;
}
六、注意
1、Category可以訪問原始類的實例變量,但不能添加變量,只能添加方法。如果想添加變量,可以考慮通過繼承創建子類
2、Category最好不要實現和本類相同的方法,本類方法會被覆蓋(Category可以實現原始類的方法,但不推薦這麼做,因爲它是直接替換掉原來的方法,這麼做的後果是再也不能訪問原來的方法)
3、多個Category中如果實現了相同的方法,只有最後一個參與編譯的纔會有效
七、Category VS 繼承(添加子類)
1、如果需要添加一個新的變量,則需添加子類。
2、如果只是添加一個新的方法,用Category是比較好的選擇。
------------------------------------------ android培訓、java培訓、期待與您交流! -------------------------------------------