一、clang編譯oc文件
一般沒有引用<UIKit/UIKit.h>
等系統(tǒng)動態(tài)庫時:
clang -rewrite-objc main.m -o main.cpp
引用oc庫時神凑,會報錯
$ clang -rewrite-objc main.m -o main.cpp
main.m:9:9: fatal error: 'UIKit/UIKit.h' file not found
#import <UIKit/UIKit.h>
^~~~~~~~~~~~~~~
1 error generated.
解決方案:
clang -x objective-c -rewrite-objc -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk main.m
其他解決方案,xcode命令行:
xcrun -sdk iphonesimulator clang -rewrite-objc main.m
xcrun -sdk iphoneos clang -rewrite-objc main.m
二何吝、開啟調試模式溉委、打印出所有運行時發(fā)送的消息
#include <objc/message.h>
extern void instrumentObjcMessageSends(BOOL);
int main(int argc, const char * argv[]) {
@autoreleasepool {
Student *student = [[Student alloc] init];
instrumentObjcMessageSends(YES);
[student saySomething];
instrumentObjcMessageSends(NO);
}
return 0;
}
執(zhí)行后,本地會多出一個文件爱榕,在/private/tmp/msgSend-xxxx
瓣喊,可以看到當前調用的所有方法。
這個需要在objc源碼環(huán)境
三黔酥、環(huán)境變量
添加方法: Project
-> Scheme
-> Edit Scheme
藻三,在 Arguments
下可以添加運行時的環(huán)境變量( Environment Variables
)
變量名 | 介紹 | 備注 |
---|---|---|
OBJC_PRINT_OPTIONS | list which options are set | 輸出OBJC已設置的選項 |
OBJC_PRINT_IMAGES | log image and library names as they are loaded | 輸出已load的image信息 |
OBJC_PRINT_LOAD_METHODS | log calls to class and category +load methods | 打印 Class 及 Category 的 + (void)load 方法的調用信息 |
OBJC_PRINT_INITIALIZE_METHODS | log calls to class +initialize methods | 打印 Class 的 + (void)initialize 的調用信息 |
OBJC_PRINT_RESOLVED_METHODS | log methods created by +resolveClassMethod and +resolveInstanceMethod: | 打印通過 +resolveClassMethod: 或 +resolveInstanceMethod: 生成的類方法 |
OBJC_PRINT_CLASS_SETUP | log progress of class and category setup | 打印 Class 及 Category 的設置過程 |
OBJC_PRINT_PROTOCOL_SETUP | log progress of protocol setup | 打印 Protocol 的設置過程 |
OBJC_PRINT_IVAR_SETUP | log processing of non-fragile ivars | 打印 Ivar 的設置過程 |
OBJC_PRINT_VTABLE_SETUP | log processing of class vtables | 打印 vtable 的設置過程 |
OBJC_PRINT_VTABLE_IMAGES | print vtable images showing overridden methods | 打印 vtable 被覆蓋的方法 |
OBJC_PRINT_CACHE_SETUP | log processing of method caches | 打印方法緩存的設置過程 |
OBJC_PRINT_FUTURE_CLASSES | log use of future classes for toll-free bridging | 打印從 CFType 無縫轉換到 NSObject 將要使用的類(如 CFArrayRef 到 NSArray * ) |
OBJC_PRINT_GC | log some GC operations | 打印一些垃圾回收操作 |
OBJC_PRINT_PREOPTIMIZATION | log preoptimization courtesy of dyld shared cache | 打印 dyld 共享緩存優(yōu)化前的問候語 |
OBJC_PRINT_CXX_CTORS | log calls to C++ ctors and dtors for instance variables | 打印類實例中的 C++ 對象的構造與析構調用 |
OBJC_PRINT_EXCEPTIONS | log exception handling | 打印異常處理 |
OBJC_PRINT_EXCEPTION_THROW | log backtrace of every objc_exception_throw() | 打印所有異常拋出時的 Backtrace |
OBJC_PRINT_ALT_HANDLERS | log processing of exception alt handlers | 打印 alt 操作異常處理 |
OBJC_PRINT_REPLACED_METHODS | log methods replaced by category implementations | 打印被 Category 替換的方法 |
OBJC_PRINT_DEPRECATION_WARNINGS | warn about calls to deprecated runtime functions | 打印所有過時的方法調用 |
OBJC_PRINT_POOL_HIGHWATER | log high-water marks for autorelease pools | 打印 autoreleasepool 高水位警告 |
OBJC_PRINT_CUSTOM_RR | log classes with un-optimized custom retain/release methods | 打印含有未優(yōu)化的自定義 retain/release 方法的類 |
OBJC_PRINT_CUSTOM_AWZ | log classes with un-optimized custom allocWithZone methods | 打印含有未優(yōu)化的自定義 allocWithZone 方法的類 |
OBJC_PRINT_RAW_ISA | log classes that require raw pointer isa fields | 打印需要訪問原始 isa 指針的類 |
OBJC_DEBUG_UNLOAD | warn about poorly-behaving bundles when unloaded | 卸載有不良行為的 Bundle 時打印警告 |
OBJC_DEBUG_FRAGILE_SUPERCLASSES | warn about subclasses that may have been broken by subsequent changes to superclasses | 當子類可能被對父類的修改破壞時打印警告 |
OBJC_DEBUG_FINALIZERS | warn about classes that implement -dealloc but not -finalize | 警告實現(xiàn)了 -dealloc 卻沒有實現(xiàn) -finalize 的類 |
OBJC_DEBUG_NIL_SYNC | warn about @synchronized(nil), which does no synchronization | 警告 @synchronized(nil) 調用,這種情況不會加鎖 |
OBJC_DEBUG_NONFRAGILE_IVARS | capriciously rearrange non-fragile ivars | 打印突發(fā)地重新布置 non-fragile ivars 的行為 |
OBJC_DEBUG_ALT_HANDLERS | record more info about bad alt handler use | 記錄更多的 alt 操作錯誤信息 |
OBJC_DEBUG_MISSING_POOLS | warn about autorelease with no pool in place, which may be a leak | 警告沒有 pool 的情況下使用 autorelease跪者,可能內存泄漏 |
OBJC_DEBUG_DUPLICATE_CLASSES | halt when multiple classes with the same name are present | 當出現(xiàn)類重名時停機 |
OBJC_USE_INTERNAL_ZONE | allocate runtime data in a dedicated malloc zone | 在一個專用的 malloc 區(qū)分配運行時數(shù)據(jù) |
OBJC_DISABLE_GC | force GC OFF, even if the executable wants it on | 強行關閉自動垃圾回收棵帽,即使可執(zhí)行文件需要垃圾回收 |
OBJC_DISABLE_VTABLES | disable vtable dispatch | 關閉 vtable 分發(fā) |
OBJC_DISABLE_PREOPTIMIZATION | disable preoptimization courtesy of dyld shared cache | 關閉 dyld 共享緩存優(yōu)化前的問候語 |
OBJC_DISABLE_TAGGED_POINTERS | disable tagged pointer optimization of NSNumber et al. | 關閉 NSNumber 等的 tagged pointer 優(yōu)化 |
OBJC_DISABLE_NONPOINTER_ISA | disable non-pointer isa fields | 關閉 non-pointer isa 字段的訪問 |