- Object-C源码解析
- 1.你真的了解 load 方法么?
- load 作为 Objective-C 中的一个方法,与其它方法有很大的不同。它只是一个在整个文件被加载到运行时,在 main 函数调用之前被 ObjC 运行时调用的钩子方法。其中关键字有这么几个
- ✓ 文件刚加载
- ✓ main 函数之前
- ✓ 钩子方法
- 调用的顺序
- ✓ 1.父类先于子类调用
- ✓ 2.类先于分类调用
- load 的应用
- ✓ load 可以说我们在日常开发中可以接触到的调用时间最靠前的方法,在主函数运行之前,load 方法就会调用。
- ✓ 由于它的调用不是惰性的,且其只会在程序调用期间调用一次,最最重要的是,如果在类与分类中都实现了 load 方法,它们都会被调用,不像其它的在分类中实现的方法会被覆盖,这就使 load 方法成为了方法调剂的绝佳时机。
- ✓ 但是由于 load 方法的运行时间过早,所以这里可能不是一个理想的环境,因为某些类可能需要在在其它类之前加载,但是这是我们无法保证的。不过在这个时间点,所有的 framework 都已经加载到了运行时中,所以调用 framework 中的方法都是安全的。
- ✓ Method Swizzling-runtime
- load 作为 Objective-C 中的一个方法,与其它方法有很大的不同。它只是一个在整个文件被加载到运行时,在 main 函数调用之前被 ObjC 运行时调用的钩子方法。其中关键字有这么几个
- 2.懒惰的 initialize 方法
- ✓ initialize 只会在对应类的方法第一次被调用时,才会调用。
- ✓ 在 lldb 中输入 p sel 打印选择子,会发现当前调用的方法是 alloc 方法,也就是说,initialize 方法是在 alloc 方法之前调用的,alloc 的调用导致了前者的执行。
- 小结
- ✓ 1.initialize 的调用是惰性的,它会在第一次调用当前类的方法时被调用
- ✓ 2.与 load 不同,initialize 方法调用时,所有的类都已经加载到了内存中
- ✓ 3.initialize 的运行是线程安全的
- ✓ 4.子类会继承父类的 initialize 方法
- ✓ 而其作用也非常局限,一般我们只会在 initialize 方法中进行一些常量的初始化。
- 1.你真的了解 load 方法么?
相关文章
- 10-30Can't initialize physical volume "/dev/sdb" of volume group "cinder-volumes"
- 10-30ffplay SDL_OpenAudio (2 channels, 44100 Hz): WASAPI can‘t initialize audio client“
- 10-30RPM故障:Failed to initialize NSS library
- 10-30NX二次开发-UFUN工程图初始化视图信息UF_DRAW_initialize_view_info
- 10-30Objetive-C initialize研究
- 10-301.Starting with Spring Initialize pom.xml文件初始化
- 10-30OC load与initialize
- 10-30caffe: fuck compile error again : error: a value of type "const float *" cannot be used to initialize an entity of type "float *"
- 10-30ERROR 1201 (HY000) Could not initialize master info structure
- 10-30weblogic .NoClassDefFoundError: Could not initialize class