category和associative是objective-c的两个扩展机制。
1.category(添加自定义方法)
#import “UIImageViewCategory.h”
@interface UIImageView(UIImageViewCategory)
-(void)extMethod;
@end
#import “UIImageViewCategory.h”
@implementation UIImageView(UIImageViewCategory)
-(void)extMethod {
.....
}
@end
2.associative(添加自定义属性)
associative是一种发生在运行时的对象关联机制(引入objc/runtime.h),将一个对象关联到另一对象,通过一个关键字建立关联,这个关键词必须是唯一的,一般采用静态字符串变量才作为关键字。
associative机制共有3个方法,设置关联对象、获取关联对象、删除关联:
/*
*源对象
*关键字:静态变量,可使用static const *NSString 或 staticchar
*关联的对象
*关联策略:assign,retain,copy等协议
*/
OBJC_EXPORTvoid objc_setAssociatedObject(id object,constvoid *key,id value,objc_AssociationPolicy policy)
OBJC_EXPORTid objc_getAssociatedObject(id object,constvoid *key)
//Removes all associations for a given object.
OBJC_EXPORTvoid objc_removeAssociatedObjects(id object)
#import<UIKit/UIKit.h>
@interface UIImageView (UIImageViewbtnImage)
@property (nonatomic, strong) UIImageView *btnImageView;
@end
#import"UIImageViewbtnImage.h"
#import <objc/runtime.h>
static char kbtnImageView;
@implementation UIImageView (UIImageViewbtnImage)
// get
-(UIImageView *)btnImageView
{
// return objc_getAssociatedObject(self, @selector(isClicked));
return objc_getAssociatedObject(self, &kbtnImageView);
}
// set
-(void)setBtnImageView:(UIImageView *)btnImageView
{
//如果是指针类型
return objc_setAssociatedObject(self, &kbtnImageView, btnImageView, OBJC_ASSOCIATION_RETAIN);
//1 源对象self
//2 关键字 唯一静态变量key isClicked
//3 关联的对象
//4 关键策略 OBJC_ASSOCIATION_RETAIN_NONATOMIC
//objc_setAssociatedObject(self, @selector(isClicked), @(isClicked), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
Category的局限性
主要有两方面局限性:
(1)无法向类中添加新的实例变量,类别没有位置容纳实例变量。可以通过associative来解决
(2)名称冲突,即当类别中的方法与原始类方法名称冲突时,类别具有更高的优先级。类别方法将完全取代初始方法从而无法再使用初始方法。这个类似于方法的重载,但是这里是直接覆盖了原方法
类别的作用
类别主要有3个作用:
(1)可以将类的实现分散到多个不同文件或多个不同框架中,方便代码管理。也可以对框架提供类的扩展(因为框架类没有源码,不能修改)。
(2)创建对私有方法的前向引用:如果其他类中的方法未实现,在你访问其他类的私有方法时编译器报错这时使用类别,在类别中声明这些方法(不必提供方法实现),编译器就不会再产生警告
(3)向对象添加非正式协议:创建一个NSObject的类别称为“创建一个非正式协议”,因为可以作为任何类的委托对象使用。