1. 程式人生 > >Objective-C 分類和類擴充套件

Objective-C 分類和類擴充套件

命名分類:

ClassA.h:

@interface ClassA:NSObject

@end

ClassA1_CategoryA.h:

#import "ClassA.h"
@interface ClassA1(CategoryA)

@end

ClassA1_CategoryA.m:

#import "ClassA1_CategoryA.h"
@impletation ClassA1(CategoryA)

@end 

分類介面定義的可見域一定要有原類介面定義。這裡使用在分類介面標頭檔案匯入原來介面標頭檔案來實現。分類方法的實現也必須找到分類,可以在原類實現檔案之外單獨寫一個實現檔案。命名分類不允許列出父類或者擴充套件原類定義的例項變數。

匿名分類和類的擴充套件

ClassA.h:

@interface ClassA:NSObject

@end

ClassA1_CategoryA.h:

#import "ClassA.h"
@interface ClassA1()
{
    //可擴充套件例項變數
}
@end

ClassA.m:

#import "ClassA1_CategoryA.h"
@impletation ClassA(CategoryA)
//主類實現檔案必須實現匿名分類定義的方法
//匿名分類不允許有自己的分離的實現區域
@end 

注意:

  • 分類中可以覆蓋原類方法,應當避免。
  • 分類的方法會影響到子類。

測試

兩條注意合併起來想到的:
去給NSObject建立分類,然後覆蓋其中的方法。會發生什麼?

CategoryTest.h:

#import <Foundation/Foundation.h>
//分類覆蓋原類方法測試
@interface NSObject(NSobjectAdd)

+ (BOOL)isSubclassOfClass:(Class)aClass;

@end

@implementation NSObject(NSobjectAdd)

+ (BOOL)isSubclassOfClass:(Class)aClass
{
    NSLog(@"fakeNSObject"
); return false; } @end

main.m:

#import "CategoryTest.h"
int main(int arg,char *argv[])
{
    @autoreleasepool
    {
        //分類覆蓋原類方法測試
        if([ClassX isSubclassOfClass:[NSObject class]])
        {
            NSLog(@"override failed");
        }else{
            NSLog(@"override successed");
        }
    }

    return 0;
}

輸出:

2017-02-22 02:45:06.823 consoleDemo[2094:85754] fakeNSObject
2017-02-22 02:45:06.824 consoleDemo[2094:85754] override successed
Program ended with exit code: 0

覆蓋成功。