1. 分类(Category)
- 分类作用
- 声明私有方法
- 分解体积庞大的类
- 把Framework的私有方法公开
- 分类的特点
- 运行时决议
- 可以为系统类添加分类
- 分类可添加的内容
- 实例方法
- 类方法
- 协议
- 属性 (只声明了
getter/setter
方法)
- 分类加载调用栈
_objc_init
-> map_2_images
-> map_images_nolock
-> _read_images
-> remethodizeClass
- 总结
- 倒序遍历宿主类的分类总数, 最后编译的分类, 最先生效(取决编译顺序)
- 分类添加的方法会’覆盖’宿主类的方法(实质上原类方法还存在)
- 名字相同的分类会引起编译报错
2. 关联对象
- 给分类添加”成员变量”
1 | (实质上并没有加到原类) |
- 关联对象的本质
- 关联对象由AssciationsManager管理并在AssociationsHashMap存储.
- 所有对象的关联内容都在 同一个全局容器中
3. 扩展
- 扩展的作用
- 声明私有属性
- 声明私有方法
- 声明私有成员变量
- 扩展的特点
- 编译时决议
- 只以声明的形式存在, 多数情况下寄生于宿主类的.m中
- 不能为系统内添加扩展
4. 代理
- 特点
- 软件设计模式
- 一般声明为weak以规避循环引用
- 一对一
5. 通知
- 特点
- 使用
观察者模式
来实现的用于跨层传递消息的机制 - 传递方式 一对多
- 实现机制
Notification_Map[notiname: oblist]
-> Observers_List
6. KVO
- 简述
- KVO是Key-value observing的缩写
- KVO是OC对观察者设计模式的一种实现
- 使用isa混写(
isa-swizzling
)技术实现
- 原理
- 为要监听的属性持有类
class A
注册一个观察者,系统会在运行时动态创建
一个class NSKVONotifying_A
类; - 然后把原类
class A
的 isa 指针指向新创建的类class NSKVONotifying_A
(isa指针指向修改即为isa混写技术); - 实际
class NSKVONotifying_A
继承class A
,这种继承关系主要是为了重写原类的Setter方法,来达到通知所有观察对象的目的.
- Setter实现
1 | // 核心方法, (手动kvo: 方法中间插入 do something) |
- KVO总结
- 使用setter方法改变值KVO才会生效
- 通过KVC设置(setValueForKey 也会进一步调用setter方法) KVO也会生效
- 通过成员变量直接修改时, KVO不生效; 需要手动添加KVO核心方法才能做到
7. KVC
- 简述
- KVC是Key-value coding的缩写
- 核心方法:
valueForKey:
,setValue:forKey:
8. 属性关键字
- 读写权限:
readwrite
(默认),readonly
- 原子性:
atomic
(赋值/获取时线程安全),nonatomic
- 引用计数:
retain/strong
,assign/unsafe_unretained
,weak
,copy
- assign
- 修饰基本数据类型, 如 int, bool
- 修饰对象类型, 不改变其引用计数, 会产生悬垂指针
- weak
- 不改变被修饰对象的引用计数
- 所指对象在被释放之后会自动置为nil
- copy
- 深拷贝产生新的内存空间, 不产生引用计数
- 浅拷贝不产生新的内存空间, 有引用计数
- 可变对象copy和mutableCopy都是深拷贝
- 不可变对象的copy是浅拷贝(指针拷贝), mutableCopy是深拷贝(内存拷贝)
- copy方法返回的都是不可变对象
- mutableCopy方法返回的都是可变对象

总结
MRC下重写retain修饰变量的setter方法?
1 | @property (nonatomic, retain) id obj; |
分类如何添加成员变量?
关联对象
KVO实现原理?
isa混写
- 本文作者: 醉疏狂
- 本文链接: https://hubin97.github.io/2020/05/20/Objective-C语言/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!