一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第8天,点击查看活动详情。
类方法存在哪里,为什么要这么设计?
对象方法存储在类中,类方法存储在元类中。
对象方法是由类实例化出来的,类是由元类实例化出来的。
这样设计的好处有以下三个方面:
- 1.底层不用对类方法和对象方法作区分,本质上都是对象方法,方法调用都可以理解为消息发送,只不过消息的接收者即方法的查找对象不一致;
- 2.这样设计更加的基于对象,类的一切信息都存储在元类中,对象的一切信息都存储在类中,类是元类的实例化对象,对象是类的实例化对象;存储也更符合面向对象的特点;
- 3.OC语言设计早期借鉴了另一种smalltalk的语言,smalltalk中也是这样设计的。
方法慢速查找过程中的二分查找流程,请用伪代码实现
- 1、二分查找的前提是数据必须有序排列;
- 2、不断的找起始位置(base)和有效数据量 (count);
- 3、当前目标位置=起始位置(base)+有效数据量(count)/2;
- 4、查找对应位置之 后不断的向前偏移,主要作用为了找到第一个符合条件的数据,即找到最前面的 category 中满足条件的方法;
first = 0;
probe;
base = first;
for (probe = 0;count !=0;count=count/2){
probe = base+count/2;
if(key == probe){
while(probe > first && key ==(probe - 1)){
probe--;
}
return probe;
}
if(key >value){
base = probe+1;
count--;
}
}
类的结构里面为什么会有rw和ro以及rwe
(1)ro 属于 clean memory,在编译即确定的内存空间,只读,加载后不会改变内容的空间;\
(2)rw 属于 dirty memory,rw 是运行时结构,可读可写,可以向类中添加属性、方法等, 在运行时会改变的内存;
(3)rwe 相当于类的额外信息,因为在实际使用过程中,只有很少的类会真正的改变他 们的内容,所以为避免资源的消耗就有了 rwe;
(4)运行时,如果需要动态向类中添加方法协议等,会创建 rwe,并将 ro 的数据优先 attache 到 rwe 中,在读取时会优先返回 rwe 的数据,如果 rwe 没有被初始化,则返回 ro 的数据。
rw 中包括 ro 和 rwe,其中 rw 是 dirtymemory,ro 是 clean memory;为了让 dirty memory 占用更少的空间,把 rw 中可变的部分抽取出来为 rwe;
clean memory 越多越好,dirty memory 越少越好,因为 iOS 系统底层虚内存机制的原 因,内存不足时会把一部分内存回收掉,后面需要再次使用时从硬盘中加载出来即 swap 机制,clean memory 是可以从硬盘中重新加载的内存,iOS 中的 macho 文件动态 库都属于此类行;dirty memory 是运行时产生的数据,这部分数据不能从硬盘中重新 加载所以必须一直占据内存,当系统物理内存紧张的时候,会回收掉 clean memory 内 存,如果 dirty memory 过大则直接会被回收掉;所以 clean memory 越多越好,dirty memory 越少越好;苹果对 rw、ro、rwe 进行这么细致的划分都是为了能更好更细致 的区别 cleanmemory 和 dirty memory;