锻炼吃饭的家伙

initialize方法

2019-02-19  本文已影响0人  二斤寂寞

总结:
通过源码可以看到, 当一个类在查找方法的时候, 会先判断当前类是否初始化, 如果没有初始化就会去掉用initialize方法
如果这个类的父类没有初始化, 就会先调用父类的initialize方法, 再调用自己的initialize方法
类在调用initialize时, 使用的是objc_msgSend消息机制调用

一、代码准备Demo地址

image.png image.png image.png image.png image.png image.png

二、运行程序

1、不主动调用任何代码, 运行程序

image.png

2、Person类调用alloc方法

objc_msgSend([Person class], @selector(alloc));
复制代码
image.png

`

image.png
objc_msgSend([Person class], @selector(initialize))
复制代码

3、Student类调用alloc方法

objc_msgSend([Student class], @selector(alloc));
复制代码
image.png

推论: 当一个类在第一次接受消息时, 会调用他自己的+(void)initialize方法, 如果他有父类, 那么就会优先调用父类的+(void)initialize方法

三、查看关于类调用+(void)initialize方法的源码

image.png image.png image.png image.png image.png image.png image.png image.png

总结:
通过源码可以看到, 当一个类在查找方法的时候, 会先判断当前类是否初始化, 如果没有初始化就会去掉用initialize方法
如果这个类的父类没有初始化, 就会先调用父类的initialize方法, 再调用自己的initialize方法
类在调用initialize时, 使用的是objc_msgSend消息机制调用

四、移除子类的+(void)initialize方法, 再次给子类发送消息

image.png
objc_msgSend([Student class], @selector(initialize))

转载文章:(防止资源地址流失,记录文章)
# 小码哥iOS学习笔记第六天: initialize方法

上一篇 下一篇

猜你喜欢

热点阅读