4. OC的两个扩展机制

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
@interface UIImageView (UIImageViewbtnImage)
@property (nonatomic, strong) UIImageView *btnImageView;
@end

#import"UIImageViewbtnImage.h"
#import 

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的类别称为“创建一个非正式协议”,因为可以作为任何类的委托对象使用。

你可能感兴趣的:(4. OC的两个扩展机制)