alloc底层跟踪

163 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

通过问题看本质!!!

TCLPerson *person = [TCLPerson alloc];

TCLPerson调用alloc方法?实际上底层的源码如何跟踪呢?

方法一:

1、在alloc方法处打断点,按住control,一直点击单步跳入(control + step into (step into instruction) 进入一条指令分步执行);最终可以找到libobjc.A.dylib objc_alloc方法。

1-------3.jpg

方法二:

1、在alloc方法处打断点,进入断点后,添加符号断点(Symbolic Breakpoint),符号断点中输入 alloc,继续执行,最终libobjc.A.dylib [NSObject alloc]:

1-----11.png

方法三:

1、在alloc方法处打断点,进入断点后。Xcode 工具栏 选择 Debug --> Debug Workflow --> Always Show Disassembly,这个选项表示始终显示反汇编 ,即通过汇编。

无法定位到libobjc.A.dylib问题

问 :无法定位到libobjc.A.dylib objc_alloc

答: Build Phases 配置   project -> Build Settings ->Linking -> Other Linker Flag ->-ObjC

-ObjC:加了这个参数后,链接器就会把静态库中所有的Objective-C类和分类都加载到最后的可执行文件中

-all_load:会让链接器把所有找到的目标文件都加载到可执行文件中,但是千万不要随便使用这个参数!假如你使用了不止一个静态库文件,然后又使用了这个参数,那么你很有可能会遇到ld: duplicate symbol错误,因为不同的库文件里面可能会有相同的目标文件,所以建议在遇到-ObjC失效的情况下使用-force_load参数。

-force_load:所做的事情跟-all_load其实是一样的,但是-force_load需要指定要进行全部加载的库文件的路径,这样的话,你就只是完全加载了一个库文件,不影响其余库文件的按需加载