• Objective-C 在Categroy中创建属性(Property)


    Objective-c中category是不能直接创建属性的,这时候我们要用到Objc的runtime来实现

    用到的方法有两个

    一个是get方法 一个set方法

    //get方法
    objc_getAssociatedObject(<#id object#>, <#const void *key#>)

    //set方法
    objc_setAssociatedObject(<#id object#>, <#const void *key#>, <#id value#>, <#objc_AssociationPolicy policy#>)

    先来解剖一下

    1.get 方法

    看字面意思,方法中第一个参数为对象,第二个为key

    那么就是获取当前对象的某个key的值

    2.set 方法

    第一个同样为对象,第二个为key,第三个为value,第四个为属性的类型(相当于设置assign,weak,strong,copy等)

    既然同样要用到key,那么意思很简单了,key就是对应我们这个属性的,通过key取值,通过key设值

    文本使用uiview的categroy作为例子

    首先新建一个category的 class

    然后就是 创建属性

    在.h 中 加入

    @property (assign,nonatomic) CGFloat            someHeight;

    然后在.m中 实现 set和get方法

    这里我用的是CGFloat类型

    由于objc给某个key设值的是对象,我们还要用到NSNumber进行一个转换

    /** 创建key */
    static const char kSomeHeightKey = '';
    /** set 方法 */
    - (void)setSomeHeight:(CGFloat)someHeight{
        //
        NSNumber *value = CGFLOAT_IS_DOUBLE?[NSNumber numberWithDouble:someHeight]:[NSNumber numberWithFloat:someHeight];
        objc_setAssociatedObject(self, &kSomeHeightKey, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    /** get 方法 */
    - (CGFloat)someHeight{
        // 取 由于从key中获取到的是对象(存的也是) 要进行一个对象转换.
        // 若类型是对象类型则不需要本转换 直接return objc_getAssociatedObject(object,&key);
        NSNumber *value = objc_getAssociatedObject(self, &kSomeHeightKey);
        return CGFLOAT_IS_DOUBLE?[value doubleValue]:[value floatValue];
    }

    运行效果

    如有错误请指正:) 欢迎交流

  • 相关阅读:
    springboot 和 spring clould 的版本匹配问题
    行到水穷处,坐看云起时!
    转: 从单体应用 -> SOA--> 微服务 ,服务治理 [熔断,限流,降级,服务恢复,服务容错,监控等等]---> RPC ---> 下一代技术[Service Mesh]
    spring-boot自定义线程池
    千与千寻的内容抓手
    哲学三问
    简约的人生
    关于中间件整理
    此心光明,亦复何言!
    能容的下你身边比你优秀的人---是一种修行
  • 原文地址:https://www.cnblogs.com/n1ckyxu/p/5157954.html
Copyright © 2020-2023  润新知