第十三节课 底层原理自测(一)
一、选择题
1.在LP64下,一个指针有多少个字节 (B)
A.4
B.8
C.16
D.64
剖析:
1个指针8字节
2.一个实例对象的内存布局存在哪些元素(A)
A.成员变量
B.supClass
C.cache_t
D.bit
剖析:
实例对象的巨细由成员变量决定,而BCD是类的布局
3.下面代码sizeof(struct3)巨细即是 (C)
struct LGStruct1 { char b; int c; double a; short d;}struct1; -- 24struct LGStruct2 { double a; int b; char c; short d;}struct2; -- 16struct LGStruct3 { double a; int b; char c; struct LGStruct1 str1; short d; int e; struct LGStruct2 str2;}struct3;A: 48
B: 56
C: 64
D: 72
剖析:
团体法
LGStruct1中有个double为8字节,以是将前面的char+int=8,8+8+2=18 对齐后=24
LGStruct2 8+4+1+2 对齐后 8+8=16
LGStruct3 8+4+1+24+2+4+16 对齐后 8+8+24+8+16=64
4.下列代码: re1 re2 re3 re4 re5 re6 re7 re8输出效果 (C)
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);A: 1011 1111
B: 1100 1011
C: 1000 1111
D: 1101 1111
剖析:
+isKindOfClass:元类继续链 vs 传入类
-isKindOfClass:类继续链 vs 传入类
+isMemberOfClass:类的元类 vs 传入类
-isMemberOfClass:对象父类 vs 传入类
5.(x + 7) & ~7 这个算法是几字节对齐 (B)
A: 7
B: 8
C: 14
D: 16
剖析:
8字节对齐(抹零后三位)
带入现实数据盘算,比方(8+7)& ~7
8+7 = 1111
~7 = 1000
& = 1000
6.判定下列数据布局巨细 (A)
union kc_t { uintptr_t bits; struct { int a; char b; };}A: 8
B: 12
C: 13
D: 16
剖析:
团结体共用内存 ,即互斥
7.元类的 isa 指向谁, 根元类的父类是谁(B,D)
A: 自己 , 根元类
B: 自己 , NSObject
C: 根元类 , 根元类
D: 根元类 , NSObject
剖析:
直接上图
8.查找方法缓存的时候发现是乱序的, 为什么? 哈希冲突怎么办理的(B)
A: 哈希函数缘故因由 , 不办理
B: 哈希函数缘故因由 , 再哈希
C: 他存他的我也布吉岛 , 再哈希
D: 他乱由他乱,清风过山岗 , 不办理
剖析:
详细实现看objc源码
9.消息的流程是 (ABCD)
A: 先从缓存快速查找
B: 慢速递归查找 methodlist (自己的和父类的,直到父类为nil)
C: 动态方法决定
D: 消息转发流程
剖析:
cache快速查找 - 慢速继续链递归查找 - 动态方法决定 - 消息转发(快速转发 + 慢速转发)
10.类方法动态方法决定为什么在后面还要实现 resolveInstanceMethod (A)
A: 类方法存在元类(以对象方法形式存在), 元类的父类终极是 NSObject 以是我们可以通过resolveInstanceMethod 防止 NSObject 中实现了对象方法!
B: 由于在oc的底层终极还是对象方法存在
C: 类方法存在元类以对象方法形式存在.
D: 咸吃萝卜,淡费心! 苹果瞎写的 不消管
剖析:
万物皆对象 、isa走位图
二、判定题
11、光凭我们的对象地点,无法确认对象是否存在关联对象
12、int c[4] = {1,2,3,4}; int *d = c; c[2] = *(d+2)
13、@interface LGPerson : NSObject{ UIButton *btn } 此中 btn 是实例变量
- 对✅
- 错
剖析:
属性 = getter + setter + 成员变量
成员变量 = 没有下划线的变量 + {}中界说
实例变量 = 具备实例化的变量,是一种特殊的成员变量
14、NSObject 除外 元类的父类 = 父类的元类
15、对象的地点就是内存元素的首地点
16、类也是对象
三、简答题
1、怎么将上层OC代码还原成 C++代码
剖析:
(1)clang -rewrite-objc xxxx.m -o xxxx.cpp
(2)xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc xxxx.m -o xxxx.cpp
2、怎么打开汇编检察流程,有什么利益 ?
剖析:
1、通过 Xcode-debug-debug workflow-always show disassembly 可以检察汇编;
2、检察汇编可以从更深层相识当前函数的汇编层面的实验,为 objc 源码分析提供信 息制止方向性错误,团结 memory read 可以更清楚的看到寄存器之间是怎样相互共同 处置处罚共同的;使用汇编检察流程,可以在不确定源码出处和实验流程的情况下,跟踪内 部代码,并可以找到出处!同时,团结下符号断点的方式,可以大概更清楚的跟踪源码实现。
3、x/4gx 和 p/x 以及 p * |