美文网首页
利用运行时(runtime)给分类(Category)动态的添加

利用运行时(runtime)给分类(Category)动态的添加

作者: 流星大石头 | 来源:发表于2016-04-06 15:22 被阅读200次

一、分类

1.分类(Category)的作用:

它可以在不改变原来的类的内容的基础上,为类增加一些方法。

2.分类使用注意点:

(1)在分类中可以增加方法

(2)在分类中不能增加成员变量

(3)在分类中可以增加属性,但是属性不能保存值,因为没有成员变量,在分类中不会生成 _变量,不会实现getter和setter方法。需要手动的实现getter和setter方法。

(4)分类中可以重新实现原来类的方法,但是会覆盖掉原来的方法,导致原来的方法无法使用

(5)方法的调用优先级:分类-->原来的类-->父类,若包含多个类,则最后参与编译的分类优先执行

二、动态关联对象

1.动态关联:

在程序运行的时候,把两个对象关联起来,使得其中一个对象成为另外一个对象的一部分。

2.方法介绍

(1)void objc_setAssociatedObject(id object,const void* key,id value,objc_AssociationPolicy policy)

参数1:需要关联的对象。

参数2:void类型的指针,一般采用静态变量来作为关键字。

参数3:要关联的值

参数4:关联策略,和属性的修饰关键字类似

(2)id objc_getAssociatedObject(id object, const void *key)

参数1:关联的对象

参数2:关联时的关键字

返回值:关联的值

(3) void objc_removeAssociatedObjects(id object)

三、通过动态关联对象给分类添加属性

@interface UITabBar()

@property (nonatomic,strong) UIView* badgeView;

@end

//关联时创建的关键字

static char keyView;

@implementation UITabBar (BadgeView)

#pragma mark - 使用运行时动态的添加属性badgeView

- (void)setBadgeView:(UIView *)badgeView{

objc_setAssociatedObject(self, &keyView, badgeView, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

#pragma mark - 用运行时获取属性

- (UIView *)badgeView{

return objc_getAssociatedObject(self,&keyView);

}

@end

相关文章

网友评论

      本文标题:利用运行时(runtime)给分类(Category)动态的添加

      本文链接:https://www.haomeiwen.com/subject/kihmlttx.html