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