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

覆蓋成功。

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