利用运行时(runtime)给分类(Category)动态的添加
一、分类
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