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

+ (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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值