OC 语言相关
2020-08-10 本文已影响0人
萝卜丝巾
引文:
-
分类
-
关联对象
-
扩展
-
代理
-
通知
-
KVO
-
KVC
-
属性关键字
分类(Category)
作用:
-
声明私有方法
-
拆分不同功能的类文件
-
把
Framework
的私有方法公开
特点:
-
运行时决议的
-
可以为系统类添加分类
-
分类添加的方法可以"覆盖"原类方法
-
同名分类方法谁生效取决于编译顺序
-
名字相同的分类会引起编译报错
添加内容:
-
实例方法
-
类方法
-
协议
-
属性 (
runtime
运行时添加)
分类的加载调用栈
image.pngeg: images
指的是镜像, 不是图片
分类的实现机制都是在remethodizeClass
方法中进行中
扩展(Extension
)
特点:
-
编译时决议
-
只声明不实现(一般寄托于宿主类)
-
不能为系统类添加扩展
KVO
简介:
-
KVO是
Key-value observing
的缩写 -
KVO是OC对观察者设计模式的实现
-
KVO主要是通过
runtime
实现的 (isa-swizzling
isa混写)
注意:
-
使用
setter
方法改变值kvo才会生效 -
使用
setValue:forKey:
改变值kvo才会生效 -
直接修改成员变量的值kvo不会生效(要手动实现方法)
Eg: 手动触发条件
willChangeValueForKey
didChangeValueForKey
image.png(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
KVC
简介:
- KVC是
Key-value coding
的缩写
[self valueForKey:<#(nonnull NSString *)#>];
[self valueForKeyPath:<#(nonnull NSString *)#>]
[self valueForUndefinedKey:<#(nonnull NSString *)#>]
[self setValue:<#(nullable id)#> forKey:<#(nonnull NSString *)#>];
[self setValue:<#(nullable id)#> forKeyPath:<#(nonnull NSString *)#>]
[self setValue:<#(nullable id)#> forUndefinedKey:<#(nonnull NSString *)#>]
valueForKey
实现机制
Accessor Method 查找类型 : <getKey>
<key>
<isKey>
Instance Var 查找类型: _key
_isKey
key
isKey
setValue:forKey:
实现机制