Category&& Extension&& objc_setAssociatedObject

runtime-给系统已有类添加属性

在没有接触runtime之前,我们接触到的能给类进行扩展的方法有类目(category)和延展(extension)两种,他们各自的特点如下:

Category

  • 用于给class及其subclass添加新的方法
  • 有自己单独的 .h 和 .m 文件
  • 用于添加新方法,而不能添加新属性(property)

Extension

  • Extension常被称为是匿名的Category
  • 用于给类添加新方法,但只作用于原始类,不作用于subclass
  • 只能对有implementation源代码的类写Extension,对于没有implementation源代码的类,比如framework class,是不可以的
  • Extension可以给原始类添加新方法,以及新属性                                                                                                                                                                                                                                                                                                                 类目(category)可以给系统已有类添加扩展方法但是不能添加属性,并且被添加的方法可以被此类的子类所继承;延展(extension)为我们的自定义类添加属性和方法,但是添加的属性和方法都是私有的,在此类的子类中是无法访问的。

那么问题来了,如果我们想给系统已有类添加一些方便我们使用的属性要怎么办呢?上述这两种方法中能给系统已有类添加的东西的就只有类目(category)了。

objc_getAssociatedObject  

objc_setAssociatedObject


如何利用runtime给系统已有类添加属性?下面用NSDictionary来举例

首先我们给NSDictionary创建一个类目,并在.h文件中添加一个属性

复制代码
#import <Foundation/Foundation.h>

@interface NSDictionary (MyDic)

@property (nonatomic, copy) NSString *name;

@end
复制代码

一般情况下我们在类目(category)中添加属性在外面使用的时候就是报错

为了不报错需要我们在.m文件中实现name属性的setter、getter方法

复制代码
- (void)setName:(NSString *)name {
    /**
     *  为某个类关联某个对象
     *
     *  @param object#> 要关联的对象 description#>
     *  @param key#>    要关联的属性key description#>
     *  @param value#>  你要关联的属性 description#>
     *  @param policy#> 添加的成员变量的修饰符 description#>
     */
    objc_setAssociatedObject(self, @selector(name), name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (NSString *)name {
    /**
     *  获取到某个类的某个关联对象
     *
     *  @param object#> 关联的对象 description#>
     *  @param key#>    属性的key值 description#>
     */
    return objc_getAssociatedObject(self, @selector(name));
}
复制代码

实现了name属性的setter和getter方法之后我们就把新添加的name属性和NSDictionary类关联起来了,现在在外面使用name属性就不会报错了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值