首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Objective-C 類別 完全指南:動態擴展類功能的利器

     編輯:關於C語言

Objective-C 類別 完全指南:動態擴展類功能的利器

類別 是 Objective-C 獨有的強大機制,允許在不修改原類代碼、不創建子類的情況下,為現有類添加新方法。廣泛用於系統框架擴展、代碼模塊化、方法分組管理。

類別核心特性

  • 方法添加後與原類方法無區別,調用方式相同
  • 父類的類別方法會被子類繼承
  • 可為系統框架類(NSString、NSArray 等)添加方法
  • 命名規範:ClassName+CategoryName(如 NSString+Revert)

類別的局限性

  1. 不能添加實例變量(無內存佈局空間),需用關聯對象或子類
  2. 覆蓋原類方法會導致 super 調用鏈斷裂,慎用
  3. 不能聲明屬性(除非配合關聯對象實現)

應用場景一:擴展自定義類

Person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
- (void)test;
- (void)eat;
@end

// 同一文件聲明多個類別
@interface Person (Creation)
- (id)initWithName:(NSString *)aName;
@end

@interface Person (Life)
- (void)eat;
- (void)sleep;
- (void)play;
@end

Person.m

#import "Person.h"

@implementation Person
- (void)test { NSLog(@"這是原有類的一個方法"); }
- (void)eat { NSLog(@"這是原有類的 eat"); }
@end

@implementation Person (Creation)
- (id)initWithName:(NSString *)aName {
    self = [super init];
    if (self) { self.name = aName; }
    return self;
}
@end

@implementation Person (Life)
- (void)eat { NSLog(@"他需要吃飯"); }      // 覆蓋原類方法(警告但生效)
- (void)sleep { NSLog(@"他需要睡覺"); }
- (void)play { NSLog(@"他需要玩耍"); }
@end

應用場景二:擴展系統框架類

NSArray+Convert.h

#import <Foundation/Foundation.h>

@interface NSArray (Convert)
+ (NSMutableArray *)arrayFromNumber:(int)number;
@end

NSArray+Convert.m

#import "NSArray+Convert.h"

@implementation NSArray (Convert)
+ (NSMutableArray *)arrayFromNumber:(int)number {
    NSMutableArray *numberArray = [NSMutableArray array];
    while (number) {
        int last = number % 10;
        number /= 10;
        [numberArray addObject:@(last)];
    }
    return numberArray;
}
@end

main.m 測試

#import <Foundation/Foundation.h>
#import "Person.h"
#import "NSArray+Convert.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // 測試自定義類擴展
        Person *jack = [[Person alloc] initWithName:@"Jack"];
        NSLog(@"Person: %@", jack.name);
        [jack test];
        [jack eat];    // 調用類別方法(覆蓋原類)
        [jack sleep];
        [jack play];
        
        // 測試系統類擴展
        NSMutableArray *arr = [NSArray arrayFromNumber:123];
        for (NSNumber *num in arr) {
            NSLog(@"number: %@", num);
        }
    }
    return 0;
}

輸出結果

Person: Jack
這是原有類的一個方法
他需要吃飯
他需要睡覺
他需要玩耍
number: 3
number: 2
number: 1

Apple 框架中的類別實例

Foundation 框架大量使用類別組織代碼,如 NSArray 分為基本操作、排序、過濾、枚舉等多個類別文件,便於維護海量代碼庫。

總結:類別 vs 擴展 vs 子類

需求推薦方案
給系統類添加方法類別
添加私有屬性/方法擴展
需要實例變量/覆蓋核心行為子類
模塊化組織大類代碼類別
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved