OC底层原理(一).alloc实际调用流程分析

2020-09-09  本文已影响0人  默默_David

OC底层原理汇总

在以前分析源码时,都是在OpenSource直接下载,然后全局搜索分析源码调用,在最新的objc781源码下载后,我们进行了可编译调试配置,调试步骤可以参考月神的:objc4-781 源码编译 & 调试

alloc源码调用流程

最新的alloc调用从源码上看和以前的差不多

alloc流程

现在我们使用可调式源码来分析下这个流程是否正确。
我们在可调试源码中添加一个target,并设置objc依赖,如下所示


目录结构 设置依赖

main.h添加代码如下:


#import <Foundation/Foundation.h>
#import "LWClassTest.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        NSObject *obj1 = [NSObject alloc];
        LWClassTest *obj2 = [LWClassTest alloc];
        
        NSLog(@"Hello, World!");
    }
    return 0;
}

我们在obj1生成处打一个断点,并设置Debug->Debug Workflow->Always Show Disassembly来查看汇编中的调用

汇编调用流程

我们看到,在[NSObject alloc]时,调用的是objc_alloc,而并不是我们以为的_objc_rootAlloc,这和我们之前研究源码的认知好像不一样,这是为什么呢?

为什么调用objc_alloc

走到这里,我们发现,虽然验证了中间要走objc_alloc流程,但是为什么会走我们还是没有解释到。
在以前的经验中,我们知道,如果某个方法,如果没有走到它的方法实现,那么它很可能被hook了,这里也是一样的道理,我们的系统在进行alloc时,会对它进行拦截,这部分我们可以看LLVM源码中的实现。

alloc实际调用流程

所以,在调用alloc方法时,实际的调用流程为:

alloc实际调用流程
上一篇 下一篇

猜你喜欢

热点阅读