objc x86_64 ABI (Call convention)

As I am doing a bit reversing job on OSX, I looked it up and wrote it down here as a backup.

self:  rdi
selector: rsi
arg0: rdx
arg1: rcx
arg2: r8
arg3: r9

 

 

Objective-C(++) 的一些细节注意点

  • 如果把 objc 类放到一个库中, 然后在主程序里并不直接引用到类本身的构造, 而是通过诸如 .xib 中命名或者类似的  serialization 方式使用这个类的话, 需要在 Linker flags 中加入 -ObjC, 否则该类不会被正确构造. 一个例子是将一个 customized view 放到 .a 中, 然后在 xib 中将一个 view 的 class 设为此 custom view, 在主程序中 load 之后, 会发现其实只产生了一个 UIView 而未产生正确的 CustomView. 解决方法就是将 -ObjC 加入到 linker flag. 如果还不行的话, 还有最后一招 -all_load. 这个 linker flag 的意思是不管三七二十一, 把所有东西都连到最后的 binary 里.
  • 作为 Objc 类的成员定义的 C++ 类, 在默认情况下, 其非默认形式的构造函数和析构函数是不会在 objc 类 init 和 dealloc 时被调用的. 要让 objc 在 init 和 dealloc 时调用作为其成员的 C++ 类的非默认构造函数以及析构函数, 必须加上这个编译器参数:  -fobjc-call-cxx-cdtors. 另外, 如果使用了 NSZombieEnabled, 无论是否有上述编译器参数, 构造和析构函数都不会被调用到.