黑馬程序員_OC基礎02_分類(Category)

---------------------------------------- android培訓java培訓、期待與您交流! -----------------------------------------


一、       使用場景

1、如何在不改變原來類模型的前提下,給類擴充一些方法?有2種方式

 繼承

分類(Category

二、    主要作用

1.      在不創建繼承類的情況下實現對已有類的擴展。

2.      簡化類的開發工作(當一個類需要多個程序員協同開發的時候,Category可以將同一個類根據用途分別放在不同的源文件中,從而便於程序員獨立開發相應的方法集合)。

3.      將常用的相關的方法分組。

4.      在沒有源代碼的情況下可以用來修復BUG。

三、    用法格式

1、原來Person類的.h聲明文件
#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培訓、期待與您交流! -------------------------------------------

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章