3、objc4源码调试()
main方法中代码如下:
#import <Foundation/Foundation.h>
#import "LGPerson.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//我这里源码是加了init,也可以不加,不影响结果,why?-可以删掉走流程一下
NSObject *objc1 = [[NSObject alloc] init];
LGPerson *objc2 = [[LGPerson alloc] init];
NSLog(@"Hello, World! %@ - %@",objc1,objc2);
}
return 0;
}
首先针对objc1进行分析,先通过打开汇编开关打开,,勾选上。
NSObject汇编分析 这里居然不是进入方法,和上一篇对不上号了,换一个试试对象objc2还是一样,源码不对了?怀疑人生了~继续分析,记住这个,关闭汇编开关,搜索这个方法,找到并加入断点,重新运行一下程序,发现果然objc1和objc2都调用这个方法,而且继续调用了方法。
objc_alloc_init方法 继续进入这个方法打上断点进行单步跟踪 callAlloc方法 这里发现了NSObject这个类的流程直接走了方法,但是LGPerson类是先走的最后一句调用方法,赶紧搜索方法断点,果然进去了而且还发现了一个神奇的方法~ Alloc方法 没错就是方法继续跟进的话就是再进入一次方法然后调用,哇~这里我上篇符号断点调试LGPerson类方法调用流程统一了,源码不曾欺我也~。但是这里也出现了两个问题:
遇到问题不能放过这就要分析。
:
源码是没办法发现了,所以只有查看系统级LLVM
源码,Android Studio
中打开源码,搜索objc_alloc_init
,搜到
EmitObjCAllocInit
方法,继续搜索这个方法:
调用objc_alloc_init方法
这里发现最终还是调用了objc_alloc_init方法。同理,如果你搜索objc_alloc
也会最终追踪到这个文件里面调用了objc_alloc
方法,第一个问题,OVER。:
在
LGPerson
初始化进行单步跟踪,进入到 callAlloc
方法发现会先走objc_msgSend
发送alloc
消息继续跟进会第二次走callAlloc
方法就会进入_objc_rootAllocWithZone
方法,第二个问题,OVER。
网友评论