iOS:自动回调/基类的那些方法

来源:互联网 发布:内部类java 编辑:程序博客网 时间:2024/06/06 09:04

+ (void)load;

  • 这是应用程序启动时(在didFinishLaunchingWithOptions之前)就会调用的方法,当load调用的时候,并不能保证所有类都加载完成且可用,必要时还要自己负责做auto release处理;
  • 只会被调用一次(不同类),相当于程序运行前把程序中所有类的load方法调用一遍,之后再不调用;
  • 对于一个类而言,没有load方法实现就不会调用,不会考虑对NSObject的继承;
  • 一个类的load方法不用写明[super load],父类就会收到调用,并且在子类之前;
  • 不会直接触发initialize的调用。

+ (void)initialize;

用来做一些初始化工作,或者单例模式的一种实现方案。

  • 第一次主动使用当前类的时才调用;
  • 在initialize方法收到调用时,运行环境基本健全;
  • initialize的运行过程中是能保证线程安全的;
  • 和load有点类似,子类不实现initialize方法,父类的&继承过来调用一遍。不同的是,在此之前,父类的方法可能已经被执行过一次了,同样不需要super调用。(注意:如果子类实现了initialize,或者父类的initialize的方法里有对self做类型判断,可以防止父类方法被多次调用)

备注:initialize和load相同点:

  • 在不考虑开发者主动使用的情况下,系统最多会调用一次;
  • 如果父类和子类都被调用,父类的调用一定在子类之前;
  • 都是为了应用运行提前创建合适的运行环境
  • 在使用时都不要过重地依赖于这两个方法,除非真正必要

参考:http://www.cocoachina.com/ios/20150104/10826.html


initWithCoder:

实现NSCoding协议,类实现了该方法,当从storyboard或者xib中创建时候,会回调该方法;

awakeFromNib:

类实现了该方法,当从storyboard或者xib中创建时候,会回调该方法;

备注:上俩个方法调用过程具体参考iOS:xib(Resource Programming Guide 部分) && IB


new 和 alloc/init的区别

+ new{id newObject = (*_alloc)((Class)self, 0);Class metaClass = self->isa;if (class_getVersion(metaClass) > 1)    return ;else    return newObject;}而 alloc/init 像这样:+ alloc{return (*_zoneAlloc)((Class)self, 0, malloc_default_zone());}- init{    return self;}

上面可以看出,new基本等同于alloc+ init;区别只在于alloc分配内存的时候使用了zone,这个zone是什么?它是给对象分配内存的时候,把关联的对象分配到一个相邻的 内存区域内,以便于调用时消耗很少的代价,提升了程序处理速度;
而为什么不推荐使用new?如果使用new的话,初始化方法被固 定死只能调用init,而你想调用initXX怎么办?

+ allocFromZone:(void *) z{return (*_zoneAlloc)((Class)self, 0, z);}+ alloc{return (*_zoneAlloc)((Class)self, 0, malloc_default_zone());}

alloc 和 init 分别把分配内存和初始化的工作分开,而且把关联的对象分配到一个相邻的内存区域内,以便于调用时消耗很少的代价,提升了程序处理速度。而new 是把分配内存和初始化的工作一起完成了,只能采用默认的init方法完成初始化,而alloc的方式可以用其他定制的初始化方法。

0 0
原创粉丝点击