美文网首页
iOS 动态绑定属性

iOS 动态绑定属性

作者: rookieme | 来源:发表于2018-12-08 11:26 被阅读0次

如何在不破坏原有类封装下添加属性

当我们想给系统类或者自定义基类添加某个属性(简称targetVaule)时,在不破坏原有类封装情形下:

  • Object-C: 可以使用继承(直接添加属性)和分类(动态添加属性)。
  • Swift: 可以使用继承(直接添加属性)和拓展(动态添加属性)。

注: 推荐使用拓展Swift分类Object-C,因为使用继承,所有使用到targetVaule都需要继承自定义属性类,侵入性太强。

动态添加属性原理

利用runtime的特性,使用关联方法,让对象和某个属性产生联系。

Object-C为分类添加属性( 动态绑定而非添加property )

.h文件中

@interface Test (NSObject)
@property (strong, nonatomic) NSString *targetVaule;
@end

.m文件中

@implementation Test (NSObject)

static char *targetVaulekey = "targetVaulekey";

- (void)setTargetVaule:(NSString *)targetVaule {
    /*
    OBJC_ASSOCIATION_ASSIGN;            // assign策略
    OBJC_ASSOCIATION_COPY_NONATOMIC;    // copy策略
    OBJC_ASSOCIATION_RETAIN_NONATOMIC;  // retain策略

    OBJC_ASSOCIATION_RETAIN;
    OBJC_ASSOCIATION_COPY;
     */
     /*
     * id object 给哪个对象的属性赋值
       const void *key 属性对应的key
       id value  设置属性值为value
       objc_AssociationPolicy policy  使用的策略,是一个枚举值,和copy,retain,assign是一样的,手机开发一般都选择NONATOMIC
          objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy);
     */

    objc_setAssociatedObject(self, targetVaulekey, targetVaule, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (NSString *)targetVaule {
    return objc_getAssociatedObject(self, targetVaulekey);
}

@end

Swift为拓展添加属性( 储存属性


struct NSObjcCategoriesKeys {
    static var targetVaulekey : String = "targetVaulekey"
}

// static var targetVaulekey : String = "targetVaulekey"

extension NSObjc {
    var targetVaule: String? {
        set(newValue) {
            objc_setAssociatedObject(self, &NSObjcCategoriesKeys.targetVaulekey, newValue, .OBJC_ASSOCIATION_COPY_NONATOMIC)

           // objc_setAssociatedObject(self, &targetVaulekey, newValue, .OBJC_ASSOCIATION_COPY_NONATOMIC)
        }
        get {
            return  objc_getAssociatedObject(self, &NSObjcCategoriesKeys.targetVaulekey) as? String
           //  return  objc_getAssociatedObject(self, &targetVaulekey) as? String
        }
    }
}

注:

  1. Swift中没有分类这个概念,仅有拓展,支持添加计算属性,不支持储存属性
  2. 动态绑定添加属性,不支持属性遍历
  3. 动态在已有的类中添加property,且能够遍历到动态添加的属性,也是runtime实现。链接:iOS 动态添加属性

相关文章

  • vue基础:属性动态绑定、事件动态绑定

    属性动态绑定 :[属性名字] 事件动态绑定 @[事件名字]

  • iOS 动态绑定属性

    如何在不破坏原有类封装下添加属性 当我们想给系统类或者自定义基类添加某个属性(简称targetVaule)时,在不...

  • angular 模板里面绑定属性

    1. 绑定静态属性 static property example 2. 绑定动态属性 动态属性绑定要用 [] /...

  • 使用__slots__实现动态绑定

    Python作为动态语言,可以实现动态绑定属性和实例方法等。 动态绑定属性 动态绑定实例方法 给一个实例绑定的方法...

  • v-bind之动态绑定

    1. v-bind 绑定基本属性 动态绑定img的src属性 动态绑定a的href属性 等等 语法糖写法(简写):...

  • 绑定属性

    v-bind指令介绍 动态绑定属性:比如a元素的href属性,img元素的src属性 作用:动态绑定属性 缩写::...

  • Python:面向对象编程(进阶)

    类动态绑定方法与限定实例属性 类动态绑定方法 前面我们说了如何给类动态的添加属性,那么如何动态绑定方法呢?如下示例...

  • 2020-01-23

    绑定属性: *v-bind:动态绑定属性 语法糖:“:” 对象语法,数组语法

  • vue动态绑定属性/事件

    1.动态绑定属性/事件

  • 动态绑定属性

    v-if:操作的是DOM,和v-else要连在一起写,不然会报错v-show:操作的是样式template是vue...

网友评论

      本文标题:iOS 动态绑定属性

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