iOS 开发 Objective-C

iOS 底层 day15 一道OC的综合题目

2020-09-07  本文已影响0人  望穿秋水小作坊
题目内容
Demo[13193:1133563] My name is <ViewController: 0x7fe536c07830>
1. 问题解析,我们对上述题目,主要存在两点疑惑
2. 为什么 print 能够正常调用?
内存结构图
3. 为什么 self.name 变成了 ViewController?
4. 我们还需要了解 [super viewDidLoad]; super 的本质是什么?
objc_msgSendSuper({self, [UIViewController class]},@selector()viewDidLoad)
5. 在此之前我们还补充相关知识
6. 所以,我们可以绘制出 -viewDidLoad 函数内部的栈空间占用情况
函数内部的栈空间占用情况
7. 修改代码验证我们的说法
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    NSString *abc = @"hahahaha";
    id cls = [YYPerson class];
    void *obj = &cls;
    [(__bridge id)obj print];
}
Demo[13379:1187071] My name is hahahaha
8. 我们通过Xcode打印栈空间的地址,取得地址上的内容,来侧面印证我们的想法
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    id cls = [YYPerson class];
    void *obj = &cls;
    NSLog(@"断点处");
    [(__bridge id)obj print];
}
(lldb) p/x &obj
(void **) $1 = 0x00007ffeedb16a70

(lldb) x/4g 0x00007ffeedb16a70
0x7ffeedb16a70: 0x00007ffeedb16a78 0x00000001020e8ea0
0x7ffeedb16a80: 0x00007fa4d3004bc0 0x00000001020e8e28

(lldb) po 0x00007ffeedb16a78
<YYPerson: 0x7ffeedb16a78>

(lldb) po 0x00000001020e8ea0
YYPerson

(lldb) po 0x00007fa4d3004bc0
<ViewController: 0x7fa4d3004bc0>

(lldb) po 0x00000001020e8e28
ViewController
上一篇 下一篇

猜你喜欢

热点阅读