小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
通过问题看本质!!!
TCLPerson *person = [TCLPerson alloc];
TCLPerson调用alloc方法?实际上底层的源码如何跟踪呢?
方法一:
1、在alloc方法处打断点,按住control,一直点击单步跳入(control + step into (step into instruction) 进入一条指令分步执行);最终可以找到libobjc.A.dylib objc_alloc方法。
方法二:
1、在alloc方法处打断点,进入断点后,添加符号断点(Symbolic Breakpoint),符号断点中输入 alloc,继续执行,最终libobjc.A.dylib [NSObject alloc]:
方法三:
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需要指定要进行全部加载的库文件的路径,这样的话,你就只是完全加载了一个库文件,不影响其余库文件的按需加载