美文网首页
OC关联对象与Demo

OC关联对象与Demo

作者: subject_2619 | 来源:发表于2018-12-24 21:46 被阅读0次

最近一直看Runtime内容,越来越感觉oc是一门功能强大的语言。关联对象是一个比较有趣的方法,一开始认为该方法的作用不大,但是在最近的sdk开发过程中,渐渐领悟其中的奥妙,能够解决一些问题。下面介绍一下如何通过关联对象来设置子类。

基本用法

1.以给定的键和策略为某对象设置关联对象值,关联对象的key通常为静态全局变量。

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

object:要关联的目标对象;
key:关联对象的key;
value:要关联的原对象;
policy:存储策略,

typedef OBJC_ENUM(uintptr_t, objc_AssociationPolicy) {
    OBJC_ASSOCIATION_ASSIGN = 0,           /**< Specifies a weak reference to the associated object. */
    OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, /**< Specifies a strong reference to the associated object. 
                                            *   The association is not made atomically. */
    OBJC_ASSOCIATION_COPY_NONATOMIC = 3,   /**< Specifies that the associated object is copied. 
                                            *   The association is not made atomically. */
    OBJC_ASSOCIATION_RETAIN = 01401,       /**< Specifies a strong reference to the associated object.
                                            *   The association is made atomically. */
    OBJC_ASSOCIATION_COPY = 01403          /**< Specifies that the associated object is copied.
                                            *   The association is made atomically. */
};

2.根据给定的键从某对象中获取相应的关联对象值

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

3.以初制定对象的全部关联对象

objc_removeAssociatedObjects(id  _Nonnull object)

通过关联对象设置子类

在SDK的开发过程中,会遇到这样的问题:SDK与主工程资源加载存在耦合;在SDK和主工程中均需要加载一些图片/ttf字体/nib,因此需要实现一套代码来加载这些资源。

static void *NSBundleMainBundleKey = &NSBundleMainBundleKey;
NSBundle* bundle = objc_getAssociatedObject(self, NSBundleMainBundleKey);
    if (bundle == nil) {
        //获取自定义Bundle对象
        NSString *path = [[NSBundle mainBundle] pathForResource:bundleName ofType:@"bundle"];
        NSBundle *newBundle = [NSBundle bundleWithPath:path];
        
        //关联2个Bundle对象
        objc_setAssociatedObject([NSBundle mainBundle], NSBundleMainBundleKey, newBundle, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }

相关文章

  • OC关联对象与Demo

    最近一直看Runtime内容,越来越感觉oc是一门功能强大的语言。关联对象是一个比较有趣的方法,一开始认为该方法的...

  • 四、isa 指针关联类

    主要内容:1.OC对象的本质2.isa 与 类的关联原理3.isa 与 类的关联验证 1.OC对象的本质 先了解编...

  • Swift 为分类增加属性objc_getAssociated

    OC 获取关联对象 Swift 获取关联对象——错误的写法 Swift 获取关联对象——正确的写法 设置关联对象 ...

  • OC关联对象

    ,❓思考一下:分类中能否添加属性?能否添加成员变量?直接上代码验证一下:创建一个Person类和它的分类Perso...

  • OC 关联对象

    关联对象是指某个OC对象通过一个唯一的key连接到一个类的实例上. 举个栗子: mikey是Person类的一个实...

  • OC关联对象

    分类实现原理、加载时机[https://www.jianshu.com/p/7c830ce3c303] 一. 为什...

  • OC底层原理 06:isa与类关联的原理

    本文的主要目的是理解类与isa是如何关联的 在介绍正文之前,首先需要理解一个概念:OC对象的本质是什么? OC对象...

  • iOS isa底层分析

    本文的主要目的是理解类与isa是如何关联的 在介绍正文之前,首先需要理解一个概念:OC对象的本质是什么? OC对象...

  • OC-关联对象

    分类(Category):是OC中的特有语法,它是表示一个指向分类的结构体指针。原则上它只能增加方法,不能增加成员...

  • 探寻OC关联对象

    简单应用 关联对象常用的API如下: 默认情况下,因为分类底层结构的限制,不能添加成员变量到分类中。但可以通过关联...

网友评论

      本文标题:OC关联对象与Demo

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