天天看點

Category 分類、類别 總結 - iOS

分類作用

分類:可以給某一個類擴充一些方法(不修改原來類的代碼)

格式

// 聲明
@interface Person (分類名稱)

@end

// 實作
@implementation Person (分類名稱)

@end
           

好處

  • 一個龐大的類可以分子產品開發
  • 一個龐大的類可以由多個人來編寫,更有利于團隊合作

給系統自帶的類添加分類

  • 給 NSString 添加一個類方法,計算某個字元串中阿拉伯數字的個數
  • 給 NSString 添加一個對象方法,計算目前字元串中的阿拉伯數字的個數
#import <Foundation/Foundation.h>

@interface NSString (YZ)
// 增加一個類方法計算某個字元串内部英文字母的個數
+ (int)zimuCountOfStr:(NSString *)str;

// 增加一個對象方法計算目前字元串内部英文字母的個數
- (int)zimuCount;

// 增加一個類方法比較兩個字元串的長度,傳回長度差
+ (int)compareLengthBetweenStr1:(NSString *)str1 andStr2:(NSString *)str2;

// 增加一個對象方法和其他字元串比較長度,傳回長度差
- (int)compareLengthWithOther:(NSString *)other;
@end
           
#import "NSString+YZ.h"

@implementation NSString (YZ)
// 增加一個類方法計算某個字元串内部英文字母的個數
+ (int)zimuCountOfStr:(NSString *)str
{
    return [str zimuCount];
}

// 增加一個對象方法計算目前字元串内部英文字母的個數
- (int)zimuCount
{
    // 1.定義變量記錄字母的個數
    int count = ;

    for (int i = ; i<self.length; i++)
    {
        // 2.取出每一個字元
        unichar c = [self characterAtIndex:i];

        // 3.如果字元是英文字母
        if ( (c>='a' && c<='z') || (c>='A' && c<='Z') )
        {
            count++;
        }
    }
    return count;
}

// 增加一個類方法比較兩個字元串的長度,傳回長度差
+ (int)compareLengthBetweenStr1:(NSString *)str1 andStr2:(NSString *)str2
{
    return [str1 compareLengthWithOther:str2];
}

// 增加一個對象方法和其他字元串比較長度,傳回長度差
- (int)compareLengthWithOther:(NSString *)other
{
    // self.length傳回的是NSUInterger類型,轉成int就不會有警告
    return (int)(self.length - other.length);
}
@end
           

注意事項

  • Category 可以通路原始類的執行個體變量,但不能添加變量,隻能添加方法,如果想添加變量,可以考慮通過繼承和建立子類
  • Category 可以實作原始類的方法,但不推薦這麼做,因為它是直接替換掉原來的方法,這麼做的後果是再也不能通路原來的方法
  • 多個 Category 中如果實作了相同的方法,隻有最後一個參與編譯的才會有效
  • 方法調用的優先級:分類(最後參與編譯的分類優先) –> 原來類 –> 父類
新部落格文章位址:Category 分類、類别 總結