Runtime 关联对象的使用

作者: David_Cap | 来源:发表于2015-09-07 17:03 被阅读1001次

现在你准备用一个系统的类,但是系统的类并不能满足你的需求,你需要额外添加一个属性。

这种情况的一般解决办法就是继承。

但是,只增加一个属性,就去继承一个类,总是觉得太麻烦类。

这个时候,runtime的关联属性就发挥它的作用了。

其实,你还可以把添加和获取关联对象的方法写在你需要用到这个功能的类的类别中,方便使用。

- (NSObject *)property {
    return objc_getAssociatedObject(self, @selector(property));
}

- (void)setProperty:(NSObject *)value {
    objc_setAssociatedObject(self, @selector(property), value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

解释一下上面的代码,property就是你要添加的属性。那么重写他的get方法,也就是说现在property获取到的事通过 objc_getAssociatedObject 获取到的东西。

然后objc_getAssociatedObject 获取到的东西就是 objc_setAssociatedObject 设置的东西。

objc_setAssociatedObject的意思就是 给当前这个类(self)添加一个 叫value的 关联属性,而且属性的唯一Id叫 @selector(property)。关联策略是 retain_nonatomic....

  1. id object给谁设置关联对象。
  2. const void *key关联对象唯一的key,获取时会用到的主键。
  3. id value关联对象。
  4. objc_AssociationPolicy关联策略,有以下几种策略:
enum {
    OBJC_ASSOCIATION_ASSIGN = 0,
    OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, 
    OBJC_ASSOCIATION_COPY_NONATOMIC = 3,
    OBJC_ASSOCIATION_RETAIN = 01401,
    OBJC_ASSOCIATION_COPY = 01403 
};

相关文章

  • NSRuntime使用篇

    使用总结runtime开源代码 对象的关联: 设置关联值 void objc_setAssociatedObjec...

  • 使用runtime关联对象

    一、添加属性 在使用类别时可以直接添加方法,不能直接添加属性,但是可以利用runtime中关联对象的方法添加属性。...

  • 为什么使用Runtime又可以添加属性?

    使用Runtime技术中的关联对象可以为类别添加属性。其原因是:关联对象都由AssociationsManager...

  • Runtime 关联对象的使用

    现在你准备用一个系统的类,但是系统的类并不能满足你的需求,你需要额外添加一个属性。 这种情况的一般解决办法就是继承...

  • Objective-C Runtime: 变量和属性

    本文只是整理Runtime中,成员变量、属性、关联对象、方法交换使用实例。不会很细致的讲解Runtime的内容,如...

  • iOS Runtime面试题(使用runtime Associa

    使用runtime Associate方法关联的对象,需要在主对象dealloc的时候释放么? 无论在MRC下还是...

  • ios运行时一些方法说明

    一. 关联对象主要函数: 基本说明:关联对象就是runTime界的NSMultableDictionary voi...

  • Runtime - 关联对象

    马上就要开始新的项目,这个礼拜抽空来写一篇博客。于是就写一个比较贴近大家工作开发的runtime其中一个用法吧。一...

  • 关联对象底层结构

    关联对象的方法 runtime给我们提供了三个关于关联对象的方法,如下。点击查看如何添加关联对象[https://...

  • Runtime 关联对象, 可在分类中添加属性

    Runtime 关联对象, 可在分类中添加属性 关联 API 如下 设置关联值 获取关联值 取消关联 关联策略

网友评论

    本文标题:Runtime 关联对象的使用

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