命名分類:
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
覆蓋成功。