iOS开发之高级操作

321 阅读2分钟

此笔记记录一些 iOS 开发中的骚操作, 至少对于目前的我来说是这样, 或者不常用的配置和命令, 比较容易忘记的.

终端

OC 源文件编译成 C++ 文件

  1. 没有引入苹果原生库的情况, 只是 OC 基本代码 例如把 main.m 编译成 main.cpp, main.m 就在当前路径, 编译后的文件也保存到当前目录, 可以根据自己的情况来设置路径.
$ clang -rewrite-objc main.m -o main.cpp
  1. 引入苹果原生库的情况, 如文件引入 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
  1. 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

image.png

lldb 读写寄存器

读取 x29 寄存器的值, 把 x29 寄存器的值设置为 0;

(lldb) register read x29
(lldb) register write x29 0

Xcode 配置

设置 Xcode 工程编译优化级别

image.png

image.png

查看 OBJC 所有环境变量帮助信息

终端输入命令

$ export OBJC_HELP=1

image.png

打印所有类的 +load 方法

配置环境变量 OBJC_PRINT_LOAD_METHODS, image.png

image.png

持续更新.....