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实现

相关推荐
LDR0063 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术3 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript
码云数智-园园3 天前
C++20 Modules 模块详解
java·开发语言·spring
swordbob3 天前
NIO的channel中什么是 fd(File Descriptor,文件描述符)
java·开发语言·nio
源分享3 天前
Java线程同步的多种实现方法(非常详细)
java·开发语言·jvm
Luminous.3 天前
C语言--day30
c语言·开发语言
何以解忧,唯有..3 天前
Go语言循环语句详解:for、range与循环控制
开发语言·算法·golang
謓泽3 天前
C语言不是语法,是通往机器的地图。
c语言·开发语言
云水一下3 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php
飞天狗1113 天前
零基础JavaWeb入门——第五课第二小节:九大内置对象 · 第2个:response(响应对象)
java·开发语言