本文是练习打字而作,如有疑问,请联系我,第一时间删除。
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 线程安全 。
网友评论