Objective-C 分類和類擴充套件
阿新 • • 發佈:2019-01-02
命名分類:
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
覆蓋成功。