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

《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.lryc.cn/news/56347.html

相关文章:

  • gpt3官网中文版-人工智能软件chat gpt安装
  • 工作常用、面试必问:Hive 窗口函数汇总
  • spring5(五):AOP操作
  • functional.partial
  • C#缩放PDF文件
  • 【Java面试八股文宝典之MySQL篇】备战2023 查缺补漏 你越早准备 越早成功!!!——Day20
  • Nsight System的安装和使用
  • Spring销毁的几种实现
  • 【 Spring 核⼼与设计思想 】
  • Arrays.sort()——逆序
  • 测试2年遇到瓶颈,如何跨过这个坎,实现涨薪5k?
  • 骑行团队怎样才能健康运行?
  • 动力节点王鹤SpringBoot3学习笔记——第四章 访问数据库
  • segno.helpers.make_mecard(Python)
  • OBCP第八章 OB运维、监控与异常处理-日常运维操作
  • springboot-gateway注册nacos失败,控制台没有报错
  • CLIP:语言-图像表示之间的桥梁
  • failed: open /etc/resolv.conf: no such file or directory“ cause k8s init failed
  • 「科普」如何评价供应商的MES系统
  • 海康3D轮廓仪调试详细步骤
  • 【Linux】PCB(进程控制块)
  • 风电的Weibull分布及光电的Beta分布组合研究(Matlab代码实现)
  • 《Effective Objective-C 2.0 》 阅读笔记 item11
  • Python常见装饰器使用(实用向)
  • 集合详解之(三)单列集合接口Set及具体子类HashSet、TreeSet
  • 力扣刷题笔记22—— 矩阵中的路径(回溯)/pair的学习
  • Spring学习1
  • Keep再闯IPO,三年亏损16亿,会员留存率跌破70%
  • 软件测试分类详解
  • 网站怎么优化出排名