Objective-C 相关

38 阅读2分钟

b65cda3ae320a00df6218371d9b979570ee25078.jpg 本文主要梳理iOS Objective-C 相关 核心知识

1.分类

2.关联对象

3.扩展

4.代理

5.通知

6.KVO

7.KVC

8.属性关键字

1.分类

分类都做了哪些事情

声明私有方法 分解体积较大的类文件 把Framework的私有方法公开

分类中都可以添加哪些内容

实例方法 类方法 协议 属性 (关联对象 类别)

特点

运行时决议

可以为系统类添加分类

类拓展可以添加实例变量,分类不能添加实例变量(因为在运行期,对象的内存布局已经确定,如果添加实例变量会破坏类的内部布局,这对编译性语言是灾难性的。)

名字相同的分类会引起编译错误

加载调用栈

_objc_init map_2_images map_images_nolock _read_images remethodizeClass

image.png

方法调用的优先级

同名方法,最后编译的分类中的方法会生效。方法调用的优先级:分类(最后参与编译的分类优先)->原来类->父类,既先去调用分类中的方法,分类中没有这个方法再去原来类中找,原来类中没有再去父类中找。

load与+ initialize的异同.png

2.关联对象

函数

image.png

本质

由associationsManager管理并在associationsHashMap存储,所有对象的关联内容都在同一个全局容器中。

image.png

3.扩展

image.png

4.代理

image.png

5.通知

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

传递方式一对多

如何实现通知机制?

map表 key为通知名称 value 为observers_list

image.png

6.KVO

image.png

7.KVC

setValueForKey

正常设置 setName _setName setIsName

如果上边notfound 判断是否设置 accessInstanceVariablesDirectly = YES

_name _isName name isName

否则 crash

ValueForKey

正常获取

getKey key isKey _key

如果上边notfound 判断是否设置 accessInstanceVariablesDirectly = YES

_key _isKey key isKey

否则 crash

image.png

image.png

8.属性关键字

image.png