美文网首页
iOS类方法load和initialize

iOS类方法load和initialize

作者: edison0428 | 来源:发表于2017-05-25 14:07 被阅读29次
    • +load

    当类被引用进项目的时候就会执行load函数(在main函数开始执行之前),与这个类是否被用到无关,每个类的load函数只会自动调用一次.由于load函数是系统自动加载的,因此不需要再调用[super load],否则父类的load函数会多次执行

    • 总结

    1.当父类和子类都实现load函数时,父类的load方法执行顺序要优先于子类
    2.类中的load方法执行顺序要优先于类别(Category)
    3.当有多个类别(Category)都实现了load方法,这几个load方法都会执行,但执行顺序不确定(其执行顺序与类别在Compile Sources中出现的顺序一致)
    4.当然当有多个不同的类的时候,每个类load 执行顺序与其在Compile Sources出现的顺序一致

    • 注意

    load调用时机比较早,当load调用时,其他类可能还没加载完成,运行环境不安全.
    load方法是线程安全的,它使用了锁,我们应该避免线程阻塞在load方法

    • 什么情况下使用

    load很常见的一个使用场景,交换两个方法的实现

    //摘自MJRefresh
    + (void)load
    {
        [self exchangeInstanceMethod1:@selector(reloadData) method2:@selector(mj_reloadData)];
        [self exchangeInstanceMethod1:@selector(reloadRowsAtIndexPaths:withRowAnimation:) method2:@selector(mj_reloadRowsAtIndexPaths:withRowAnimation:)];
        [self exchangeInstanceMethod1:@selector(deleteRowsAtIndexPaths:withRowAnimation:) method2:@selector(mj_deleteRowsAtIndexPaths:withRowAnimation:)];
        [self exchangeInstanceMethod1:@selector(insertRowsAtIndexPaths:withRowAnimation:) method2:@selector(mj_insertRowsAtIndexPaths:withRowAnimation:)];
        [self exchangeInstanceMethod1:@selector(reloadSections:withRowAnimation:) method2:@selector(mj_reloadSections:withRowAnimation:)];
        [self exchangeInstanceMethod1:@selector(deleteSections:withRowAnimation:) method2:@selector(mj_deleteSections:withRowAnimation:)];
        [self exchangeInstanceMethod1:@selector(insertSections:withRowAnimation:) method2:@selector(mj_insertSections:withRowAnimation:)];
    }
    + (void)exchangeInstanceMethod1:(SEL)method1 method2:(SEL)method2
    {
     method_exchangeImplementations(class_getInstanceMethod(self, method1), class_getInstanceMethod(self, method2));
    }
    
    • +initialize

    initialize在类或者其子类的第一个方法被调用前调用。即使类文件被引用进项目,但是没有使用,initialize不会被调用。由于是系统自动调用,也不需要显式的调用父类的initialize,否则父类的initialize会被多次执行。假如这个类放到代码中,而这段代码并没有被执行,这个函数是不会被执行的

    • 总结

    1.父类的initialize方法会比子类先执行
    2.当子类不实现initialize方法,会把父类的实现继承过来调用一遍。在此之前,父类的方法会被优先调用一次
    3.当有多个Category都实现了initialize方法,会覆盖类中的方法,只执行一个(会执行Compile Sources 列表中最后一个Category 的initialize方法)

    • 注意:

    在initialize方法收到调用时,运行环境基本健全。
    initialize内部也使用了锁,所以是线程安全的。但同时要避免阻塞线程,不要再使用锁

    参考:http://www.jianshu.com/p/c52d0b6ee5e9

    相关文章

      网友评论

          本文标题:iOS类方法load和initialize

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