继承自NSObject的不常用又很有用的函数(1)
初始化阶段 —— load 和 initialize
load函数
原型:
+(void)load
当类被引用进程序的时候会执行这个函数。
在一个程序开始运行之前(在main函数开始执行之前),在库开始被程序加载,load函数就会开始被执行。
我们开发的程序都可以认为是一个库,但是库又不会独立存在(我们的程序还会引用其他库,也可能被其他函数引用),所以库的初始化顺序可以如下:
- 初始化我们引用的库
- 执行我们自己库的Objective-C的load函数
- 执行C++和C的static初始化变量
- 初始化引用我们库的其他库
在我们的编写的库中,会有很多类重写load函数,他们之间的执行顺序是不确定的。
当父类和子类都实现load函数时,父类的load函数会被先执行。load函数是系统自动加载的,因此不需要调用父类的load函数,否则父类的load函数会多次执行。
在Category中写load函数是不会替换原始类中的load函数的,原始类和Category中的load函数都会被执行,原始类的load会先被执行,再执行Category中的load函数。当有多个Category都实现了load函数,这几个load函数执行顺序不确定。
Initialize函数
原型:
+ (void)initialize
当类第一次被执行到的时候这个函数会被执行。
如果类包含继承关系,父类的initialize函数会比子类先执行。由于是系统自动调用,也不需要显式的调用父类的initialize,否则父类的initialize会被多次执行。
假如这个类放到代码中,而这段代码并没有被执行,这个函数是不会被执行的。
Load or Initialize
这两个函数没有交集,也没有执行的先后顺序,他们各自遵循着各自的调用原则。因此在写逻辑的时候,不能有逻辑依赖load函数比initialize函数先行调用。
来看下面这种情况:
@interface NoneClass : NSObject @end @implementation NoneClass +(void)load { NSLog(@"NoneClass _cmd: %@", NSStringFromSelector(_cmd)); MyTestObject *test = [[MyTestObject alloc] init]; } @end @interface MyTestObject @end @implementation MyTestObject + (void) load { NSLog(@"MyTestObject _cmd: %@", NSStringFromSelector(_cmd)); } + (void)initialize { NSLog(@"MyTestObject _cmd: %@", NSStringFromSelector(_cmd)); } @end
输出的结果:
-- ::44.297 ObjectTest[:60b] NoneClass _cmd: load -- ::44.300 ObjectTest[:60b] MyTestObject _cmd: initialize -- ::44.301 ObjectTest[:60b] MyTestObject _cmd: load
结果分析:
由于在执行NonoClass的load函数中调用了MyTestObject的构造函数,这样会触发MyTestObject的initialize函数调用。而此时MyTestObject的load函数还没有被调用。
使用场景:
将针对于类修改放在intialize中,将针对Category的修改放在load中。
但是假如我们是修改系统的类,一般会通过添加Category来添加功能,但是如果修改initialize会导致原生的intialize不会执行,所以放在load中会比较妥当。
参考:
继承自NSObject的不常用又很有用的函数(1)的更多相关文章
- 继承自NSObject的不常用又很有用的函数(2)
函数调用 Objective-C是一门动态语言,一个函数是由一个selector(SEL),和一个implement(IML)组成的.Selector相当于门牌号,而Implement才是真正的住户( ...
- linux不常用但很有用的命令(持续完善)
Linux登录后设置提示信息: /etc/issue 本地端登录前显示信息文件 /etc/issue.net 网络端登录前显示信息文件 /etc/motd 登陆后显示信息文件 可以添加以下几个常用选项 ...
- Sql Server 三个很有用的函数
好久没有写有关SqlServer 数据库方面技术的文章了,正好今天遇到了一个问题,我就把这个当做一个练习记录下来.今天遇到一个麻烦事,详情如下:公司买了一个系统,在这个系统里面有一个“充值卡”的功能, ...
- CSS3中不常用但很有用的属性-1
内容来源于W3Cschool和<图解CSS3核心技术与案例实战> 1.:target选择器 URL 带有后面跟有锚名称 #,指向文档内某个具体的元素.这个被链接的元素就是目标元素(targ ...
- mysql不常用但很有用的语句整理
mysqld_multi多实例停止.启动 mysqld_multi --defaults-file=/etc/my.cnf start 1,2 mysqld_multi --defaults-file ...
- java不常用但很有用的问题排查工具(持续完善)
因为用的频率不是很多,老忘掉,每次都要搜下,特记录下备忘. 查看进程的启动jvm选项 [root@iZ23nn1p4mjZ ~]# jinfo -flags 16603Attaching to pro ...
- 不常用但很有用的git show 和 git blame
团队使用git 合作时,可能遇见想要查看一段比较难以阅读代码, 此时可能需要联系最新的修改者是哪位,这时候最有用的最快捷的方法就是git blame 啦, 这个指令的output是一个文件的各个区域段 ...
- closest()一个在评论里很有用的函数
实例 本例演示如何通过 closest() 完成事件委托.当被最接近的列表元素或其子后代元素被点击时,会切换黄色背景: $( document ).bind("click", fu ...
- 8个很有用的PHP安全函数,你知道几个?
原文:Useful functions to provide secure PHP application 译文:有用的PHP安全函数 译者:dwqs 安 全是编程非常重要的一个方面.在任何一种编程语 ...
随机推荐
- 突然的明白--public static 类名 函数名()
public static ImageUtilEngine getImageEngine() { return imageEngine; } 这个是什么啊........纠结了一个多星期的东西 忽然间 ...
- DB2编目配置及管理
打开命令:db2cmd 我一般打开的方式如下: (在db2) ...
- C++ 怎么让静态变量只初始化一次
童鞋们在学习C++的时候,往往只是按照书本上的原文去强行记忆各种特性,比方说,静态变量只初始化一次.你心中一定在默念:一定要记住,static只会初始化一次云云,希望自己能够记住.告诉你,你为什么总是 ...
- 【小程序】访问 https配置的数据接口
小程序对于网络请求的URL的特殊要求:1)不能出现端口号; 2)不能用localhost; 3) 必须用https (一)搭建本地https服务器(windows) 搭建出来的服务 ...
- 避免写慢SQL
最近在整理数据库中的慢SQL,同时也查询了相关资料.记录一下,要学会使用执行计划来分析SQL. 1. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且 ...
- Liunx-cp命令
1. 复制当前目录的test文件夹 到/201904 目录 出现如下截图问题是因为test目录下还有文件,所以得加-r,使用递归拷贝.我现在用这个命令拷贝文件都加-r了,不管有文件还是没文件 2.复制 ...
- Newtonsoft.Json.Linq对象读取DataSet数据
Newtonsoft.Json.Linq对象读取DataSet数据: private void button4_Click(object sender, EventArgs e) { ...
- Spring3 访问静态资源
<mvc:resources location="/jquery/" mapping="/jquery/**"/> <mvc:resource ...
- 20155211《网络对抗》Exp02 后门原理与实践
20155211<网络对抗>Exp02 后门原理与实践 实验内容 (1)使用netcat获取主机操作Shell,cron启动 (2)使用socat获取主机操作Shell, 任务计划启动 ( ...
- Exp3
利用不同免杀方式生成文件 1.msfvenom 使用msfvenom命令查看功能介绍 其中有: -p 选择一个载荷(或者叫模块) -l 载荷列表 -f 生成的文件格式 -e 编码方式 -l 编码次数 ...