F4dd8c295eb99413212807db065237e5
iOS高级之美-OC对象底层上篇

前言: iOS 高级之美 是本人总结了一些工作实际开发研究以及面试重点,围绕底层进行 源码分析 - LLDB 调试 - 源码断点 - 汇编调试,让读者真正感受 Runtime底层之美~😊
目录如下:
iOS 高级之美(一)—— iOS_objc4-756.2 最新源码编译调试
iOS 高级之美(二)—— OC对象底层上篇
iOS 高级之美(三)—— OC对象底层下篇
iOS 高级之美(四)—— isa原理分析
iOS 高级之美(五)—— 类结构分析上篇
iOS 高级之美(六)—— malloc分析
iOS 高级之美(七)—— 24K纯技术男~KC_2019年终总结
iOS 高级之美(八)—— 类结构分析中篇
iOS 高级之美(九)—— 类结构分析下篇

一、小专栏研究方向

这个专栏我们从这一篇开始进入底层研究!iOS的漫漫底层,很多小伙伴也是会和笔者一样,不从如何下手!

一天灵感乍现,我索性从最开始入手:dyld_start开始

从这里就开始我这个小专栏的探索之旅:

  • dyld 启动加载动态库、共享内存、全局C++对象的构造函数的调用、一系列的初始化、dyld注册回调函数

  • libsystem 的初始化 libSystem_initializer

  • libdispatch_init 队列环境的准备

  • _os_object_init 过渡到 _objc_init

  • 以及_dyld_objc_notify_register 镜像文件的映射

  • 类-分类-属性-协议-SEL-方法 的加载

  • 展开分析 Runtime 各个部分的原理

这里面分析的角度-思维都是比较有意思!为了让大家有比较好的体验感-我先从大家最熟悉的开始 - OC对象

二、OC对象的alloc

我们要研究对象,肯定是从创建开始研究的!下面我有一个非常有意思的提问,小伙伴们不妨花十秒思考一下!

    LGPerson *p1 = [LGPerson alloc];
    LGPerson *p2 = [p1 init];
    LGPerson *p3 = [p1 init];
    LGNSLog(@"p1:%@-%p-%p",p1,p1,&p1);
    LGNSLog(@"p2:%@-%p-%p",p2,p2,&p2);
    LGNSLog(@"p3:%@-%p-%p",p3,p3,&p3);

  • 这里p1对象是否创建完成

  • p1和p2以及p3是否为同一个对象

p1:<LGPerson: 0x60000137c030>-0x60000137c030-0x7ffeea184138
p2:<LGPerson: 0x60000137c030>-0x60000137c030-0x7ffeea184130
p3:<LGPerson: 0x60000137c030>-0x60000137c030-0x7ffeea184128

不知道你脑海中的答案是否这个上面的打印一致

  • 从上面可以得出我们创建了三个临时对象 p1/p2/p3

  • p1/p2/p3 这三个对象的指针是不同的但是他们所指向的内存是同一片!

  • 从反向可以证明 alloc 才是创建对象-开辟内存

  • init 只是一个初始化构造函数

我的天啊,alloc 出来就已经把对象的内存地址已经确定,那么是怎么确定的呢?下面开始探索

  • 现在我们跳进这个万恶之源
  • 发现跳不进去查看实现,怎么办,请来到 opensource,接下来几天都会动不动不就进去了!!我希望每一个同学都不要只在这外面蹭一蹭,深层交流才有意义

  • 没有注释
  • 没有源码实现
  • 更加不知道下一步流程

发现进不去了,怎么办?看到不具体的源码实现! 很多时候我们经常也会遇到这样的情况,就是想做一些事,就是碰壁,处从下手!大家请注意里:我要开始装逼咯!

三、alloc底层探索思路

top Created with Sketch.