zoukankan      html  css  js  c++  java
  • 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];
    }

    运行效果

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

  • 相关阅读:
    .NetCore 部署到IIS上的问题
    泛型(EF)增删改查
    Ef数据GroupBy多字段查询Vb.net与c#参考
    WEBAPI 最近更新项目时 服务器总是提示:An error has occurred.
    SQL SERVER 语法
    Fonour.AspnetCore 生成SQL SERVER数据库
    Windows10出现打开EXE应用程序错误
    jQuery实现DOM加载方法源码分析
    前端面试高频题:删除数组重复元素的多种方法
    Mac 下使用homebrew 安装node后全局安装找不到问题
  • 原文地址:https://www.cnblogs.com/n1ckyxu/p/5157954.html
Copyright © 2011-2022 走看看