(轉自:http://blog.sina.com.cn/s/blog_4431c7610100x15t.html)
class dump是一個命令行工具,用來監測存儲在Mach-O二進制文件理的Objective-C運行時信息。它為類(class),分類(category)和協議(protocol)生成聲明信息。這些信息與 otool -ov 命令提供的信息是一樣的,但表示得更像正常的Objective-C的聲明,所以它更緊湊,更易讀
為什么要使用class-dump
對於好奇的人,是一個好工具。你可以看到閉源應用程序,框架(framework)和軟件包(bundle)的設計。
http://www.codethecode.com/download/class-dump-3.3.3.dmg (2010-08-08)
http://www.codethecode.com/download/class-dump-3.3.3.tar.bz2
http://bitbucket.org/nygard/class-dump
用法
class-dump [options]
選項可以是
-a 顯示實例變量偏移
-A 顯示實現地址
–arch <arch> 選擇一個指定的架構,如ppc, ppc7400, ppc64, i386, x86_64
-C <regex> 只顯示同正則表達式匹配的類
-f <str> 在方法名中查找字符串
-H 在當前目錄生成頭文件,或者在用-o選項指定的目錄生成
-I 對類,目錄,協議 按照繼承關系(inheritance)進行排序(覆蓋-s選項)
-o <dir> 為-H選項指定輸出目錄
-r 遞歸擴展framework,並修復VM共享庫
-s 按名稱對classes和categories進行排序
-S 按名稱對方法(method)進行排序
–list-arches 類出文件中的arches,然后退出
–sdk-root 指定 SDK root 路徑(完全路徑,或者 4.1 , 4.0, 3.2, 10.6 , 10.5, 3.1.3, 3.1.2)
class-dump-x是一個class-dump的修改版,在當時(2008年) class-dump 3.1.2不支持Objective-C 2.0 ABI). Objective-C 2.0 ABI刪除了OBJC段,在data段引入了一些新的section. 並且 class/obj的布局也邊了。
它不生成@property聲明,因為所有的properties被映射到方法了。 不創建@property 元素,這樣的源碼可以與objc 1.0的編譯器兼容
http://iphone.freecoder.org/class-dump-3.1.2-x-1.0.1.tar.bz2 (修改版本)
http://iphone.freecoder.org/class-dump-x (Leopard上運行的二進制)
http://iphone.freecoder.org/class-dump-x-iphone (iPhone運行的二進制)
class_dump_z 是對上面兩個的改進
為什么需要另外一個class-dump
因為class-dump-x對ivar offsets的計算也是錯誤的,並不支持properties
原版的class-dump雖然也支持ABI2 了,但對ivar 的計算依然是錯誤的
class-dump-z 主要針對 iPhone 程序進行dump, 不支持以下特性
64位(除非以后iPhone上的內存超過4G了)
Objective-C 1.0 ABI(iPhone用2.0)
class-dump-z完全用C++重寫,避免動態調用,不像class-dump和class-dump-x那樣使用Objective-c寫。刪除不必要的調用,使得class-dump-z比它的前任們快10倍左右。並且可以在Linux,Mac, iPhone上運行
選項
-p 轉換未聲明的getters和setters為properties
-h proto 隱藏那些已經出現在 協議中的方法
-h super 隱藏繼承來的方法
-y <root> 選擇sysroot, 默認是最后一版的iPhoneOS SDK 或者 /
-u <arch> 選擇指定的架構( armv6, armv7等)
-a 打印ivar 偏移
-A 打印 實現的VM地址
-k 顯示額外的注釋
-k -k 顯示更多注釋
-R 顯示指針聲明 , int *a 而不是 int* a(因為前者更明顯地表達了指針的語義)
-N 保持原始結構名 (不用 CFArrayRef代替 __CFArray)
-b 在 +/- 號之后放一個空格, 也就是 + (void) ,而不是 +(void)
-i <file> 讀取並更新簽名提示文件
-C <regex> 只顯示匹配的types
-f <regex> 只顯示匹配的methods
-g 只顯示導出classes
-X <list> 忽略所有types(除了categories)
-h cats 隱藏categories
-h dogs 隱藏協議(這哥們太幽默了,上面是cats(分類),這里就是dogs了
-S 將types按字幕順序排序
-s 將方法按字母順序排序
-z 按照字母順序對方法排序,但將class方法和 -init 放在最見面
-H 分離頭文件
-o <dir> 將頭文件放到這個目錄,而不是當前目錄