美文网首页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