iOS-load/initialize

  • Object-C源码解析
    • 1.你真的了解 load 方法么?
      • load 作为 Objective-C 中的一个方法,与其它方法有很大的不同。它只是一个在整个文件被加载到运行时,在 main 函数调用之前被 ObjC 运行时调用的钩子方法。其中关键字有这么几个
        • ✓ 文件刚加载
        • ✓ main 函数之前
        • ✓ 钩子方法
      • 调用的顺序
        • ✓ 1.父类先于子类调用
        • ✓ 2.类先于分类调用
      • load 的应用
        • ✓ load 可以说我们在日常开发中可以接触到的调用时间最靠前的方法,在主函数运行之前,load 方法就会调用。
        • ✓ 由于它的调用不是惰性的,且其只会在程序调用期间调用一次,最最重要的是,如果在类与分类中都实现了 load 方法,它们都会被调用,不像其它的在分类中实现的方法会被覆盖,这就使 load 方法成为了方法调剂的绝佳时机。
        • ✓ 但是由于 load 方法的运行时间过早,所以这里可能不是一个理想的环境,因为某些类可能需要在在其它类之前加载,但是这是我们无法保证的。不过在这个时间点,所有的 framework 都已经加载到了运行时中,所以调用 framework 中的方法都是安全的。
        • ✓ Method Swizzling-runtime
    • 2.懒惰的 initialize 方法
      • ✓ initialize 只会在对应类的方法第一次被调用时,才会调用。
      • ✓ 在 lldb 中输入 p sel 打印选择子,会发现当前调用的方法是 alloc 方法,也就是说,initialize 方法是在 alloc 方法之前调用的,alloc 的调用导致了前者的执行。
      • 小结
        • ✓ 1.initialize 的调用是惰性的,它会在第一次调用当前类的方法时被调用
        • ✓ 2.与 load 不同,initialize 方法调用时,所有的类都已经加载到了内存中
        • ✓ 3.initialize 的运行是线程安全的
        • ✓ 4.子类会继承父类的 initialize 方法
        • ✓ 而其作用也非常局限,一般我们只会在 initialize 方法中进行一些常量的初始化。
上一篇:三张图带你弄懂stl内存分配器,再也不怕面试官问了


下一篇:MariaDB主从复制搭建