美文网首页iOS 高级开发
ios类的深入研究

ios类的深入研究

作者: 动感新势力fan | 来源:发表于2016-03-15 22:19 被阅读250次

1.load

20160312163815426.png

+load 方法是当类或分类被添加到 Objective-C runtime 时被调用的,实现这个方法可以让我们在类加载的时候执行一些类相关的行为。子类的 +load 方法会在它的所有父类的 +load 方法之后执行,而分类的 +load 方法会在它的主类的 +load 方法之后执行。但是不同的类之间的 +load 方法的调用顺序是不确定的。

子类 +load 方法等父类先执行完 +load 方法才执行。

分类 +load 方法会在它的主类 +load 方法之后执行。

2.+initialize 方法

20160312163841218.png

+initialize 方法是在类或它的子类收到第一条消息之前被调用的,这里所指的消息包括实例方法和类方法的调用。也就是说 +initialize 方法是以懒加载的方式被调用的,如果程序一直没有给某个类或它的子类发送消息,那么这个类的 +initialize 方法是永远不会被调用的。那这样设计有什么好处呢?好处是显而易见的,那就是节省系统资源,避免浪费。

runtime 使用了发送消息 objc_msgSend 的方式对 +initialize 方法进行调用。也就是说 +initialize 方法的调用与普通方法的调用是一样的,走的都是发送消息的流程。换言之,如果子类没有实现 +initialize 方法,那么继承自父类的实现会被调用;如果一个类的分类实现了 +initialize 方法,那么就会对这个类中的实现造成覆盖。

因此,如果一个子类没有实现 +initialize 方法,那么父类的实现是会被执行多次的。

3.只有实现了load方法的类才会调用这个方法,虽然继承了父类的,但这个父类的load不会当作子类的load被runtime调用

**具体分析 详见这个网站

http://blog.iderzheng.com/objective-c-load-vs-initialize/

http://www.cocoachina.com/ios/20150104/10826.html

load方法的应用 http://blog.sunnyxx.com/2015/03/09/notification-once/

屏幕快照 2016-03-15 17.50.44.png

所有类也是对象( 类对象) 都是class类型的对象class内部包含*

加载普通对象时 先把类加载进内存 每种类内存中只存在一份

利用Class创建 Person类对象
利用Person类对象 创建Person类型的对象

屏幕快照 2016-03-15 17.21.59.png

示意图

屏幕快照 2016-03-15 17.22.33.png

test是类方法
[Person test] 等价与
Person *p = [[Person alloc]init]
Class c = [p class]
[c test]
就是一个class类型的内存地址

相关文章

网友评论

    本文标题:ios类的深入研究

    本文链接:https://www.haomeiwen.com/subject/mqkqlttx.html