此笔记记录一些 iOS 开发中的骚操作, 至少对于目前的我来说是这样, 或者不常用的配置和命令, 比较容易忘记的.
终端
将 OC 源文件编译成 C++ 文件
- 没有引入苹果原生库的情况, 只是 OC 基本代码
例如把
main.m编译成main.cpp,main.m就在当前路径, 编译后的文件也保存到当前目录, 可以根据自己的情况来设置路径.
$ clang -rewrite-objc main.m -o main.cpp
- 引入苹果原生库的情况, 如文件引入
UIKit库, 这个时候就会有报错, 此时要加上 Xcode 相关参数.
$ clang -rewrite-objc -fobjc-arc -fobjc-runtime=ios-15.0.0 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator15.0.sdk
- 用
xcrun解决UIKit库报错,Xcode安装的时候顺带安装了xcrun命令,xcrun命令在clang的基础上进行了 一些封装,要更好用一些.
// 模拟器
xcrun -sdk iphonesimulator clang -arch arm64 -rewrite-objc main.m -o main-arm64.cpp
// 手机
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main- arm64.cpp
查找可执行文件中的符号
比如 MacO 文件, 静态库 .a .framework, 三方SDK 等等, 例如查找 UIWebView
nm -pa AlipaySDK | grep UIWebView
查找包含字符串的文件
循环遍历查找文件夹下包含某字符串的文件所有文件, 并输出文件全路径, 这个也可以查到可执行文件中的符号.
grep -r UIWebView .
lldb 操作
lldb 读取内存
- 按照
8字节一段格式化从对象首地址开始读取内存信息, 有指针的时候用 8 字节比较方便,
(lldb) x/4gx teacher
- 十六进制打印
->类的地址
(lldb) p/x 0x011d800100008189 & 0x00007ffffffffff8ULL
- 二进制打印
->isa的每一个二进制位
(lldb) p/t 0x011d800100008189
- 按照
4字节一段格式化从对象首地址开始读取内存信息
(lldb) x/4gw teacher
lldb 读写寄存器
读取 x29 寄存器的值, 把 x29 寄存器的值设置为 0;
(lldb) register read x29
(lldb) register write x29 0
Xcode 配置
设置 Xcode 工程编译优化级别
查看 OBJC 所有环境变量帮助信息
终端输入命令
$ export OBJC_HELP=1
打印所有类的 +load 方法
配置环境变量 OBJC_PRINT_LOAD_METHODS,
持续更新.....