2022-05-21 86
有多选,有单选
解析:1个指针8字节
8
解析: 实例对象的大小由成员变量决定。其中BCD是类的结构
成员变量
struct LGStruct1 { char b; int c; double a; -- 逢8归零 short d; }struct1; -- 24 struct LGStruct2 { double a; int b; char c; short d; }struct2; -- 16 struct LGStruct3 { double a; int b; char c; struct LGStruct1 str1; short d; int e; struct LGStruct2 str2; }struct3;
解析: 整体归零法LGStruct1 看最大a,意味着前面b+c占8字节,a占8字节,c占2字节,需要对齐,即满足8的倍数 ==> 24字节LGStruct2 看最大a,a占8字节,b+c+a 占8字节,对齐==> 16字节LGStruct3 a占8字节,b+c占8字节,str1占24字节,d+e占8字节,str2占16自己, 对齐==>64字节
解析: 整体归零法
整体归零法
BOOL re1 = [(id)[NSObject class] isKindOfClass:[NSObject class]]; BOOL re2 = [(id)[NSObject class] isMemberOfClass:[NSObject class]]; BOOL re3 = [(id)[LGPerson class] isKindOfClass:[LGPerson class]]; BOOL re4 = [(id)[LGPerson class] isMemberOfClass:[LGPerson class]]; NSLog(@" re1 :%hhd\n re2 :%hhd\n re3 :%hhd\n re4 :%hhd\n",re1,re2,re3,re4); BOOL re5 = [(id)[NSObject alloc] isKindOfClass:[NSObject class]]; BOOL re6 = [(id)[NSObject alloc] isMemberOfClass:[NSObject class]]; BOOL re7 = [(id)[LGPerson alloc] isKindOfClass:[LGPerson class]]; BOOL re8 = [(id)[LGPerson alloc] isMemberOfClass:[LGPerson class]]; NSLog(@" re5 :%hhd\n re6 :%hhd\n re7 :%hhd\n re8 :%hhd\n",re5,re6,re7,re8);
解析:+isKindOfClass:元类继承链 vs 传入类-isKindOfClass:类继承链 vs 传入类+isMemberOfClass:类的元类 vs 传入类-isMemberOfClass:对象父类 vs 传入类
解析:
解析: 8自己对齐(抹零后三位)带入实际数据计算,例如(8+7)& ~78+7 => 1111~7 => 1000& => 1000
解析: 8自己对齐(抹零后三位)
带入实际数据计算,例如(8+7)& ~7
union kc_t { uintptr_t bits; struct { int a; char b; }; }
解析:联合体共用内存 ,即互斥
解析:经典的isa走位图
解析:具体实现看objc源码
解析:cache快速查找 - 慢速继承链递归查找 - 动态方法决议 - 消息转发(快速转发 + 慢速转发)
解析:万物皆对象 、isa走位图
解析:可以通过isa判断关联对象的标识
解析:内存偏移
解析:属性 = getter + setter + 成员变量成员变量 = 没有下划线的变量 + {}中定义实例变量 = 具备实例化的变量,是一种特殊的成员变量
没有下划线
{}
实例化
解析:isa走位图
解析:万物皆对象
解析:clang -rewrite-objc xxx.m -o xxx.cppxcrun -sdk iphoneos clang -arch arm64 -rewrite-objc xxx.m -o xxx.cpp
解析:Xcode - Debug - workflow - 勾选always show disassembly好处:了解当前函数更深层的汇编执行,以及函数的底层实现,方便跟踪内部代码,并找到代码来源
解析:x/4gx 输出一段内存地址,以8字节的形式输出8段p/x 输出一个数据结构的地址p *$0 *$0为指向某一个数据空间的指针,输出该数据的数据结构
x/4gx
p/x
p *$0
解析:对象方法存储在类中,类方法存储在元类中好处:底层并未区分对象和类,其本质都是对象,即万物皆对象方法调用的本质是消息发送,只是消息的接受者(即方法的查找对象)有所区别设计更加基于对象,符合面向对象的特性
解析:不断的找起始位置base、有效数据量count当前目标位置 = base + 有效数据量/2查找到对应位置之后,不断向前偏移,目的是为了找到第一个符合条件的数据
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-- } }
解析: 目的是为了得到isa中存储的class信息。大部分isa都是不纯的isa,即nonpointIsa,是一个64位的联合体位域数据,而存储class信息的部分只有其中的部分位,剩余的位置存储了其他信息读取class信息时,需要将其他位的信息清零,此时就需要用到掩码任何数据与isa_mask进行按位与操作,都只保留isa_mask对应位的信息。其目的就是遮盖不需要的位
解析: 目的是为了得到isa中存储的class信息。
解析:ro属于clean memory,即在编译时期确定的内存空间,只读,加载后不会再改变的内存rw属于dirty memory,是运行时产生的内存,可读可写,可以向类中添加属性、方法等,即在运行时可以改变的内存rwe相当于类的额外信息,因为在使用过程中,只有很少的类会真正改变其内容,所以为了避免资源浪费就有了rwe运行时如果需要动态向勒种添加方法、协议等,会创建rwe,并将ro的数据优先attach到rwe中。在读取时会优先返回rwe的数据,如果rwe中没有被初始化,则返回ro有扩展,从rwe获取没有扩展,从ro获取rw中包含ro、rwe,其目的是为了让dirty memory占用更少的空间,将rw中可变的部分抽取出来作为rweclean memory越多越好,dirty memory越少越好。因为iOS 系统底层是虚拟内存机制,在内存不足时,会将一部分内容回收掉,后面使用时需要再次从磁盘中加载的。而clean memory是可以从磁盘中重新加载的内存,例如mach-o文件、动态库。dirty memory是运行时产生的数据,是不能从磁盘中重新加载的,所以必须一直占用内存当系统物理内存紧张时会回收clean memory,如果dirty memory过大则会直接回收掉设计ro、rwe、rw的目的是为了更好更细致的区分clean memory和dirty memory
ro
编译时期确定的内存空间
rw
运行时产生的内存
rwe
类的额外信息
clean memory越多越好,dirty memory越少越好
clean memory
dirty memory
解析:一般情况下:如果当前方法cache后,缓存的使用容量超过总容量的3/4,需要先进行扩容,扩容为原来的2倍,然后再插入本次的方法某些特殊预处理宏定义编译命令下,首次会存储满之后在进行扩容扩展选择3/4作为负载因子,是和hash表中使用的链表和红黑树数据结构有关,0.75是最符合泊松分布概率计算得出的数值,此时的hash表的空间和时间效率是最高的
3/4
2倍
解析:使用汇编响应速度快使用了两个循环循环1:通过获取的mask与要查找的_cmd进行hash运行,获取下表,从而获取_cmd对应的bucket;然后通过向前平移查找,每次平移16位,如果找到对应的sel,则cacheHit;当平移到bucket的首地址时,如果还没有找到,则进入循环2循环2:首先获取末尾bucket地址,同样采用向前查找方式,向_cmd对应的地址进行平移查找
响应速度快
mask
_cmd
bucket
末尾bucket地址
解析: isa走位图 + 方法查找逻辑类的isa指向元类,在方法快速查找过程中,会根据类的isa找到元类,如果元类中没有该方法,怎会走到lookUpImpOrForward慢速查找流程中,会根据元类的继承链进行递归查找。其中元类的父类是根元类,根元类的父类指向NSObject,所以会找到NSObject的同名对象方法
解析: isa走位图 + 方法查找逻辑
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。