ios八股文 -- Objective-c

分类

  1. 声明私有方法

  2. 分解体积庞大的类文件

  3. 把Framework的私有方法公开化

特点:

运行时决议

为系统类添加分类:不能给系统类添加扩展

分类中可以添加的内容

  1. 实例方法

2.类方法

3.协议

4.属性:声明的对应的get和set方法,并没有添加实例变量

分类的加载

编译时倒序遍历,最先访问最后编译的分类,也就是最后编译的分类中的方法会生效

并且分类方法会覆盖宿主类方法,因为我们时根据选择器名称查找的吗,并且找到第一个就返回,所以宿主类方法依然存在,但是被覆盖

关联对象

该方法用来给分类添加成员变量

  1. objc_setAssociatedObject - 为对象设置关联值
  2. objc_getAssociatedObject - 获取对象的关联值
  3. objc_removeAssociatedObjects - 移除对象的所有关联值

设置关联对象时需要指定内存管理策略,常用的有:

  • OBJC_ASSOCIATION_ASSIGN - 弱引用(类似 assign)
  • OBJC_ASSOCIATION_RETAIN_NONATOMIC - 强引用,非原子性(类似 strong, nonatomic)
  • OBJC_ASSOCIATION_COPY_NONATOMIC - 复制,非原子性(类似 copy, nonatomic)

关联对象的本质

其核心是通过全局哈希表来动态维护对象与附加数据的关联关系。

全局哈希表 :由objc_association_manager管理,键是被关联的对象(id) ,值是该对象对应的objc_association_map(即该对象的所有关联属性集合)

扩展

声明私有属性

声明私有方法

声明私有成员变量

特点

编译时决议

只以声明的形式存在,多数情况下寄生于宿主类的.m文件中

不能为系统类添加扩展

代理

一种软件设计模式

传递方式为1对1

一般以weak以规避循环引用

通知

使用观察者模式来实现的用于跨层传递消息的机制

传递方式为一对多

在通知中心存在一个map,存在通知名称和观察者列表的映射

KVO

key value observing

观察者设计模式的又一实现,使用来isa混写机制来实现

当我们调用addobserver这个方法的时候,系统会为我们动态创建NSKVONotifying_A这个类(继承A,重写setter方法),然后将原来类A的isa指针指向这个新的类

通过kvc设置value会使value生效

但是通过成员变量直接赋值不会使value生效,但是我们可以添加willchange或者didchange实现手动KVO实现

相关推荐
Pniubi2 小时前
HashMap的扩容和树化边界
java·开发语言
gCode Teacher 格码致知4 小时前
Pandas教学-17:Series与Dataframe的关系
开发语言·python·pandas
发量惊人的中年网工4 小时前
分公司访问总部ERP慢怎么办?SD-WAN组网的排查与验收要点
服务器·开发语言·php
下页、再停留4 小时前
【C#桌面客户端系列学习-15】生成可视化图表之折线图、柱状图、饼状图
开发语言·c#
ShineWinsu5 小时前
对于JavaScript:操作元素的解析
开发语言·前端·javascript·面试·web·dom·元素
益莱储中国6 小时前
深度解析:RF 实验室从 5G迈向 6G 的过程中保持技术领先与设备升级的路径
开发语言·php
benchmark_cc7 小时前
Python 量化系统如何设计统一的数据访问接口:从策略解耦到数据层架构
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
const_qiu7 小时前
第四章 00:开篇 —— 从「会聊天」到「记得住、会干活、能协作」
java·开发语言·人工智能·python
Wang's Blog7 小时前
Java 项目实战: 交友项目 - 个人资料管理的更新接口实现与坑
java·开发语言·交友
开心猴爷8 小时前
应对iOS审核4.3:可以使用 IpaGuard 来给属性名混淆的技术细节与平衡之道
后端·ios