在开发的过程中,随着时间的推移,我们需要对一些类的功能和属性进行扩展。我们虽然可以通过重新修改类的方法进行属性和功能的扩展。但是对于我们想给Xcode系统的本身的类添加一个我们常用到的方法的时候,我们就麻烦了。因此,为了方便我们对类的扩展,OC中就有类目这一方法。
在.h中声明类目
@interface Student (Catagory)
在.m文件中
@implementation Student (Catagory)
@end
中实现方法。
类目可以添加在Student类的本身的两个.h和.m文件中,也可以新建文件。
如果没有类目名就是延展,延展就在Student类本身的.m文件中
@implementation Student
@end
中实现方法,声明可以在其他地方。
我们可以通过延展来实现一个私有的方法,此方法无法被此类之外的类的对象调用,即使是子类也不行。
我们建立一个Student类
import <Foundation/Foundation.h>
import <objc/runtime.h>
//正常的类声明
@interface Student : NSObject
-(id) init;
@end
//声明类的延展
@interface Student ()
-(void) privateFunc3;
@end
//声明一个类目
@interface Student (Catagory0)
//在类目中可以添加属性和方法,但是添加属性必须重新setter和getter方法,这些新的方法和属性可以被子类继承。
@property (nonatomic,assign) NSInteger sum;
-(void) func0;
@end
#import "Student.h"
@implementation Student
//类本身的一个正常的方法
-(id) init {
return self;
}
//实现Student.h文件中声明的延展的私有方法,也可以不实现方法,但是会警告,不会影响程序运行。
-(void) privateFunc3 {
NSLog(@"privateFunc3");
}
//实现其他文件声明的私有方法,也可以不实现方法,但是会警告,不会影响程序运行。
-(void) privateFunc4 {
NSLog(@"privateFunc4");
}
@end
//实现类目中的方法和属性
@implementation Student (Catagory0)
//必须重写getter方法,用@synthesize sum报错
-(void) setSum:(NSInteger)sum {
//将非对象类型转换成对象类型
NSNumber *number = [NSNumber numberWithInteger:sum];
//要导入头文件#import <objc/runtime.h>,设置数值,0表示assgin
objc_setAssociatedObject(self, @selector(setSum:),number, 0);
}
//重写getter方法
-(NSInteger) sum{
return [objc_getAssociatedObject(self, @selector(setSum:)) /* 拿到数值字符串*/integerValue/*类型转换*/];
}
//实现Student.h文件中声明类目中的方法
-(void) func0 {
NSLog(@"func0");
}
@end
用新建文件实现类目和延展
#import "Student.h"
//为Student添加第二个类目,类目不能相同
@interface Student (Catagory)
-(void) func1;
@end
//为Student添加第三个类目
@interface Student (MyCatagory)
-(void) func2;
@end
//为Student添加延展声明,实现在Student.m文件中
@interface Student ()
-(void) privateFunc4;
@end
#import "Student+Catagory.h"
@implementation Student (Catagory)
-(void) func1 {
NSLog(@"func1");
}
@end
@implementation Student (MyCatagory)
-(void) func2 {
NSLog(@"func2");
}
@end