OC 语言相关

2020-08-10  本文已影响0人  萝卜丝巾


引文:


  1. 分类
  2. 关联对象
  3. 扩展
  4. 代理
  5. 通知
  6. KVO
  7. KVC
  8. 属性关键字

分类(Category)

作用:

  1. 声明私有方法

  2. 拆分不同功能的类文件

  3. Framework的私有方法公开

特点:

  1. 运行时决议的

  2. 可以为系统类添加分类

  3. 分类添加的方法可以"覆盖"原类方法

  4. 同名分类方法谁生效取决于编译顺序

  5. 名字相同的分类会引起编译报错

添加内容:

  1. 实例方法

  2. 类方法

  3. 协议

  4. 属性 (runtime运行时添加)

image.png

分类的加载调用栈

image.png

eg: images 指的是镜像, 不是图片

分类的实现机制都是在remethodizeClass 方法中进行中

image.png
扩展(Extension)

特点:

  1. 编译时决议

  2. 只声明不实现(一般寄托于宿主类)

  3. 不能为系统类添加扩展

KVO

简介:

  1. KVO是Key-value observing 的缩写

  2. KVO是OC对观察者设计模式的实现

  3. KVO主要是通过runtime 实现的 (isa-swizzling isa混写)

注意:

  1. 使用setter 方法改变值kvo才会生效

  2. 使用setValue:forKey:改变值kvo才会生效

  3. 直接修改成员变量的值kvo不会生效(要手动实现方法)

    Eg: 手动触发条件 willChangeValueForKey didChangeValueForKey

(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

image.png
KVC

简介:

  1. 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 实现机制

image.png

Accessor Method 查找类型 : <getKey> <key> <isKey>

Instance Var 查找类型: _key _isKey key isKey

setValue:forKey: 实现机制

image.png
上一篇下一篇

猜你喜欢

热点阅读