Category是什么?
Category用于向已经存在的类添加方法来达到扩展已有类的目的。在对系统类进行扩展的时候,可以直接给系统类添加方法。新添加的方法同样也会被扩展的类的所有子类自动继承。
#import "ClassName.h"
@interface ClassName ( CategoryName )
// method declarations
- (void)method1;
@end
Category的注意点:
1)不能在分类中重写系统方法,因为会把系统的功能给覆盖掉,而且分类中不能调用super。但是,这种情况可以用来修复,没有源码的类中方法有Bug的情况。
2)category不能给类添加实例变量。使用runtime的方式,可以给iOS添加属性字段。objc_getAssociatedObject() objc_setAssociatedObject()
3)category添加的方法不强制要求在implement文件中实现,可以利用消息转发指定其他对象去实现。
Category的用途
1)无需创建继承类,实现对已有类扩展。并且可以被扩展的类的所有子类自动继承。
2)可以用来修复没有源码类的bug。
3)对于一个类多个开发人员维护的情况,可以根据不同用途创建不同分类。
Extensions
extension可以称为匿名的category。extension声明的方法在implement文件中一定要实现。extension可以添加实例变量和属性变量。extension常用的一个功能是,原类中readonly的属性变量,可以在extension中重新声明为readwrite。并且属性变量的读写方法都要在implement文件中实现。
如下:
//原类
@interface MyClass : NSObject
@property (retain, readonly) float value;
@end
// Private extension, typically hidden in the main implementation file.
@interface MyClass ()
@property (retain, readwrite) float value;
@end