细说OC中load和initialize方法

本文是练习打字而作,如有疑问,请联系我,第一时间删除。

OC中有俩个特殊的类方法,分别是load和initialize。本文总结一下这俩个方法的区别与联系、使用场景和注意事项。Demo可以在我的Github上找到 -- load 和 initialize,如果觉得有帮助还望点个star以示支持,总结在文章末尾。

load
故名思议,load方法在这个文件被程序装载时调用。只要是在Complle Sources中出现的文件总是被装载,这与这个类是否被用到无关,因此load方法总是在main函数之前调用。
如果一个类没有实现load方法,那么就不会调用它父类的load方法,这一点与正常的类基础和方法调用不一样,需要额外注意一下。

调用规则
如果一个类实现了load方法,在调用这个方法前首先调用父类的load方法。而且这个过程是自动完成的,并不需要我们手动实现:

执行顺序
load方法调用时,系统处于脆弱状态,如果调用别的类的方法,且该方法依赖于那个类的load方法进行初始化,

load方法的调用顺序其实有迹可循,我们看到demo的项目设置如下:
在Compile Sources中,文件的排放顺序就是其装载顺序,这一点也证明了load方法中会自动调用父类的方法,因为在demo的输出结果中,Parent的load方法先与Child调用,而它的装载顺序其实在Child之后。

initialize
这个方法在第一次给某个类发送消息时调用(比如实例化一个对象),并且只会调用一次。initialize方法实际是一种惰性调用,也就是说一个类一直没被用到,那它的initialize方法也不会被调用,这一点有利节约资源。

调用规则
与load方法类似的是,在Initialize方法内部也会调用父类的方法,而且不需要我们显示的写出来,这会导致一个很严重的问题。

总结
load和initialize方法都会在实例化对象之前调用,以main函数为分水岭,前者在main函数之前调用,后者在之后调用。这俩个方法会被自动调用,不能手动调用它们。
load和initialize方法都不用显示的调用父类的方法而是自动调用,即时子类没有initialize方法也会调用父类的方法。
load方法常用来 Method Swizzle ,initialize方法常用 初始化全局变量或静态变量。
4.load initialize 线程安全 。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容