load与initialize
NSObject类有两种初始化方式load
和initialize
load
+ (void)load;
对于加入运行期系统的类及分类,必定会调用此方法,且仅调用一次。
iOS会在应用程序启动的时候调用
load
方法,在main
函数之前调用执行子类的load方法前,会先执行所有超类的load方法,顺序为父类->子类->分类
在load方法中使用其他类是不安全的,因为会调用其他类的load方法,而如果关系复杂的话,就无法判断出各个类的载入顺序,类只有初始化完成后,类实例才能进行正常使用
load 方法不遵从继承规则,如果类本身没有实现load方法,那么系统就不会调用,不管父类有没有实现(跟下文的initialize有明显区别)
尽可能的精简
load
方法,因为整个应用程序在执行load方法时会阻塞,即,程序会阻塞直到所有类的load方法执行完毕,才会继续load 方法中最常用的就是方法交换
method swizzling
initialize
+ (void)initialize;
在首次使用该类之前由运行期系统(非人为)调用,且仅调用一次
惰性调用,只有当程序使用相关类时,才会调用
运行期系统会确保
initialize
方法是在线程安全的环境中执行,即,只有执行initialize的那个线程可以操作类或类实例。其他线程都要先阻塞,等待initialize执行完如果类未实现
initialize
方法,而其超类实现了,那么会运行超类的实现代码,而且会运行两次(load 第5点)initialize 遵循继承规则
初始化子类的的时候会先初始化父类,然后会调用父类的
initialize
方法,而子类没有覆写initialize
方法,因此会再次调用父类的实现方法鉴于此,
initialize
方法实现如下:+ (void)initialize {
if (self == [People class]) {
NSLog(@"%@ initialize", self);
}
}
initialize方法也需要尽量精简,一般只应该用来设置内部数据,比如,某个全局状态无法在编译期初始化,可以放在initialize里面。
static NSMutableArray *kSomeObjects;
@implementation People
+ (void)initialize {
if (self == [People class]) {
kSomeObjects = [NSMutableArray new];
}
}
总结:
1. 在加载阶段,如果类实现了load方法,系统就会调用它,load方法不参与覆写机制
2. 在首次使用某个类之前,系统会向其发送initialize消息,通常应该在里面判断当前要初始化的类,防止子类未覆写initialize
的情况下调用两次
3. load与initialize方法都应该实现得精简一些,有助于保持应用程序的响应能力,也能减少引入“依赖环”(interdependency cycle)的几率
4. 无法在编译期设定的全局常量,可以放在initialize方法里初始化
load与initialize的更多相关文章
- load和initialize方法
一.load 方法什么时候调用: 在main方法还没执行的时候 就会 加载所有类,调用所有类的load方法. load方法是线程安全的,它使用了锁,我们应该避免线程阻塞在load方法. 在项目中使 ...
- OC load与initialize
OC load与initialize load 当类被引用进程序的时候会执行这个函数 一个类的load方法不用写明[super load],父类就会收到调用,并且在子类之前. Category的loa ...
- Objective C类方法load和initialize的区别
Objective C类方法load和initialize的区别 过去两个星期里,为了完成一个工作,接触到了NSObject中非常特别的两个类方法(Class Method).它们的特别之处,在于 ...
- NSObject的load和initialize方法(转)
全文转载自:http://www.cocoachina.com/ios/20150104/10826.html 在Objective-C中,NSObject是根类,而NSObject.h的头文件中前两 ...
- load 与initialize的调用顺序小结
开发中实用方法固然是最贴近应用的,当一些程序原理还是要先搞清晰,根据查找的一些资料,总结了一些load与initialize的调用. APP启动到执行main函数之前,程序就执行了很多代码 执行顺 ...
- 细说OC中的load和initialize方法
OC中有两个特殊的类方法,分别是load和initialize.本文总结一下这两个方法的区别于联系.使用场景和注意事项.Demo可以在我的Github上找到--load和initialize,如果觉得 ...
- load vs. initialize
这篇文章来对比一下NSObject类的两个方法,+load与+initialize. + (void)load; Invoked whenever a class or category is add ...
- iOS load和initialize的区别
可能有些还不清楚load和initialize的区别,下面简单说一下: 首先说一下 + initialize 方法:苹果官方对这个方法有这样的一段描述:这个方法会在 第一次初始化这个类之前 被调用,我 ...
- +(void)load; +(void)initialize;有什么用处?
总得来说: 1.+load方法是在main函数之前调用的: 2.遵从先父类后子类,先本类后列类别的顺序调用: 3.类,父类与分类之间的调用是互不影响的.子类中不需要调用super方法,也不会调用父类的 ...
随机推荐
- SNS网站成功原因剖析_完结
SNS网站成功原因剖析 前言 亿注册用户)为例,讨论下 Fackbook成功的原因,进而分析结合国内环境,讨论当前国内流行的 SNS网站成功失败要素. 一.Facebook (一) Facebook总 ...
- Backbone入门讲解
Backbone是一个实现了web前端mvc模式的js框架. 一种解决问题的通用方法,我们叫做模式. 设计模式:工厂模式,适配器模式,观察者模式等,推荐js设计模式这本书.设计模式是一种思想. 框架模 ...
- PadLeft 和 PadRight
1 PadLeft 即:向已知字符串左边补充字符,使整个字符串到达指定长度 CREATE FUNCTION PadLeft ( ),/*原始字符*/ @TotalLength int,/*总长度*/ ...
- 大毕设-matlab-AM调制解调
博主大毕设关于数字下变频(DDC)的CUDA实现,预计工期比较长,所以留下一些文字记录. 主要分为两部分工作,Matlab仿真部分和CUDA实现. 由于很久没有仿真了,所以先用一个简单的AM调制仿真练 ...
- iOS 10开发NSAssert(断言)的使用
断言(NSAssert)的使用 字数1055 阅读3270 评论3 喜欢30 NSAssert()是一个宏,用于开发阶段调试程序中的Bug,通过为NSAssert()传递条件表达式来断定是否属于Bug ...
- 循序渐进Python3(十一) --5-- 同源策略
一.什么是同源策略 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能.它是由Netscape提出的一个著名的安全策略,现在所有的可支持javascript ...
- mongo管理工具
启动 D:\Program Files\MongoDB\Server\3.4\bin\mongod.exe --dbpath d:\data\db 还原 D:\Program Files\MongoD ...
- tp框架实现防止非法登录
<?phpnamespace Admin\Controller;use Think\Controller;class UserController extends Controller {//登 ...
- Postgresql死锁处理
今天遇到Postgresql的一个问题,部分表记录的update一直无效报错,初步判断为锁表,赶紧进行解决. 1. 查询死锁进程列表 select * from pg_stat_activity wh ...
- css学习中的一些英文单词
indent 缩进 through通过 decoration装饰 position定位