当前位置: 首页 > article >正文

《Effective Objective-C 2.0 》 阅读笔记 item10

第10条:在既有类中使用关联对象存放自定义数据

1. 关联对象

可以给某对象关联许多其他对象,这些对象通过“键”来区分,这就是关联对象。存储对象值的时候,可以指明“存储策略”(storage policy),用以维护相应的“内存管理语义”

*** 存储策略 ***
存储策略由名为objc_AssociationPolicy的枚举所定义的。

下表为:
该枚举的取值和与之对应的@property属性。

表 对象关联类型

关联类型等效的@property属性
OBJC_ASSOCIATION_ASSIGNassign
OBJC_ASSOCIATION_RETAIN_NONATOMICnonatomic,retain
OBJC_ASSOCIATION_COPY_NONATOMICnonatomic, copy
OBJC_ASSOCIATION_RETAINretain
OBJC_ASSOCIATION_COPYcopy

下列方法可以管理管理对象:

  • void objc_setAssociatedObject(id object, void*key, id value, objc_AssociationPolicy)
    此方法以给定的键和策略为某对象设置关联对象值。
  • id objc_getAssociatedObject(id object, void*key)
    此方法根据给定的键从某对象中获取相应的关联对象值。
  • void objc_removeAssociatedObjects(id object)
    此方法移除指定对象的全部关联对象。

由于设置关联对象时所用的键是个“不透明的指针”(opaque pointer),所以在设置关联对象值时,若想令两个键匹配到同一个值,则两者必须是完全相同的指针才行。鉴于此,在设置关联对象值时,通常使用静态全局变量做键。

2. 关联对象用法举例

例子:在一个类里创建一个警告视图后,设定一个与之关联的“块”并将它们放在同一作用域里,等到执行delegate方法时再将其读出来。这种方式创建的UIAlertView与处理操作结果的代码都放在一起,更易读懂。但是,由于块可能要捕获某些变量,也会造成“保留环”。
总结:这种做法只应该在其他办法行不通时才去考虑用它
作者推荐:若是多次用到alert视图,有个更好的办法,那就是从中继承子类,把块保存为子类中的属性。

要点

  • 可以通过“关联对象”机制来把两个对象连起来。
  • 定义关联对象时可指定内存管理语义,用以模仿定义属性时所采用的“拥有关系”与“非拥有关系”。
  • 只有在其他做法不可行时才应选用关联对象,因为这种做法通常会引起难于查找的bug。


http://www.kler.cn/a/6191.html

相关文章:

  • 56.在 Vue 3 中使用 OpenLayers 通过 moveend 事件获取地图左上和右下的坐标信息
  • 【GO基础学习】gin的使用
  • C++并发编程之内存顺序一致性
  • 【深度学习进阶】基于CNN的猫狗图片分类项目
  • 蓝耘平台使用InstantMesh‌生成高质量的三维网格模型!3D内容创作!小白入门必看!!!
  • 代码随想录算法训练营第五十二天|KM101.孤岛的总面积|KM102.沉没孤岛|KM103.水流问题|KM104.建造最大岛屿
  • 从大到小排序-课后程序(JavaScript前端开发案例教程-黑马程序员编著-第3章-课后作业)
  • 第6章 封装组件高级篇(下) - table
  • 【经验】PCB拼板,不得不注意的10个问题,要收藏哦!
  • MySQL-事务
  • spark sql(五)sparksql支持查询哪些数据源,查询hive与查询mysql的区别
  • 【新2023Q2模拟题JAVA】华为OD机试 - 二叉树层次遍历
  • Linux下 lsof 命令详解
  • 文件系统设计详解
  • 蓝桥杯第21天(Python)(疯狂刷题第4天)
  • Kafka 原理以及分区分配策略剖析
  • 【HTML系列】第五章 · 表单
  • 【新2023Q2模拟题JAVA】华为OD机试 - 最大报酬
  • 多地发布暴雨蓝色预警,池塘水质危机,养殖户如何测控?
  • ThreeJS-自定义矩形BufferGeometry(八)
  • C++ Primer第五版_第七章习题答案(11~20)
  • 【CVPR2022】On the Integration of Self-Attention and Convolution自注意力和卷积的融合
  • shell编程之免交互
  • 为你的网站加上Loading等待加载效果吧 | Loading页面加载添加教程
  • 金丹三层 —— 内存函数和字符串操作函数详解
  • Android MediaCodec设置H264 Profile到High