博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Runtime系列 2 -- 成员变量与属性
阅读量:5930 次
发布时间:2019-06-19

本文共 1356 字,大约阅读时间需要 4 分钟。

Ivar

      成员变量和属性其实都比较简单, 先讲一下成员变量的类型 Ivar, 其实际是指向 objc_ivar 的结构体指针(ps: 好多东西实际上都是结构体指针, 如 id):

        

      ivar_name: 成员变量名

      ivar_type: 变量类型

      ivar_offset: 基地址偏移字节

      space: 占用空间

objc_property_t

      objc_property_t: oc 中属性的类型, 也是指向了 objc_property 的结构体指针, 但是我们看不到它的实现, 它关联了一个结构体 objc_property_attribute_t, objc_property_attribute_t 定义了属性的特征例如, 属性名称、属性编码类型、原子类型/非原子类型等:

    

      name: 特征名

       value: 特征值

关联对象

      其实本篇文章主要想讲的就是关联对象, 它是 runtime 中比较实用的功能, 正常情况下, 我们是不可以在分类中添加成员变量的, 但是有了关联对象, 我们就可以做到了. 关联对象像是通过 key 去找 value, 不过 key 是 const void * 罢了, 我们还需要指定一个内存管理策略, 告诉 runtime 如何去管理这个对象的内存:

      OBJC_ASSOCIATION_ASSIGN: 弱引用, 当被关联对象(也就是宿主)释放时, 关联对象不跟着一起释放.

      OBJC_ASSOCIATION_RETAIN_NONATOMIC: 强引用(非原子), 宿主释放时,关联对象跟着一起释放, 非线程安全.

      OBJC_ASSOCIATION_COPY_NONATOMIC: 复制关联对象(非原子), 同 OBJC_ASSOCIATION_RETAIN_NONATOMIC 一致.

      OBJC_ASSOCIATION_RETAIN: 强引用(原子): 同 OBJC_ASSOCIATION_RETAIN_NONATOMIC 一致, 线程安全.

      OBJC_ASSOCIATION_COPY: 复制关联对象(原子), 同 OBJC_ASSOCIATION_RETAIN 一致.

      runtime 的关联对象与我们平时用的属性有些相似, 设置属性用 setter 方法, 获取属性用 getter 方法, 关联对象也是如此:

      object: 需要关联的对象.

      key: 可以根据这个 key 去查找关联的属性.

      value: 要关联的属性.

      policy: 内存管理策略.

          

      object: 需要获取关联的对象.

       key: 根据这个 key 去查找关联的属性.

demo

       举个栗子?, 我们可以写一个分类为 button 添加一个 block 形式的点击事件, 如图所示:

                                     

       分类的 .h 文件只写了一个 block 属性和一个参数为 block 的方法:

                          

      分类 .m 文件, 从截图上面就可以看出来, 与我们平时用的 setter 和 getter 非常类似, 只不过是通过关联对象来实现的:

       这里是 demo 的 , 如果喜欢的话, 大家可以为这篇文章点个 ❤️, 加个关注呦!

转载于:https://juejin.im/post/5a43446b518825455f2f909a

你可能感兴趣的文章
ready 事件 DOM(文档对象模型) 已经加载....
查看>>
js 模拟form表单post提交
查看>>
感觉还不错,值得借鉴的一个listbox样式
查看>>
DOM domain
查看>>
谈谈C#中的,DateTime
查看>>
虚拟机
查看>>
永远不要忘记坑过的岁月
查看>>
Codeforces 189A:Cut Ribbon(完全背包,DP)
查看>>
转帖:kindeditor编辑区空格被隐藏,导致所见所得不一致的解决办法
查看>>
linux下Mycat的安装配置
查看>>
Node使用 Express框架,实现文件上传
查看>>
(三)Cacti的使用
查看>>
leetcode 102二叉树的层序遍历
查看>>
CentOS7 下安装 SublimeText3
查看>>
Android中Dialog对话框的调用及监听
查看>>
网络15软工个人作业5——软件工程总结
查看>>
Vmware Workstation _linux yum 仓库搭建
查看>>
Hibernate的二级缓存
查看>>
js面向对象之属性
查看>>
创建日历和日期列表
查看>>