首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

Objective-C 調試日誌增強:預處理宏與隱式參數實戰技巧

     編輯:關於C

Objective-C 開發中,善用編譯器內建宏與 _cmd 隱式參數,能在日誌中自動輸出方法名、行號、文件、類名、調用棧,極大提升調試效率。本文匯總常用宏、表達式與實戰範例。

C/C++/ObjC 通用預處理宏

宏格式說明
__func__%s當前函數名(C99)
__LINE__%d源碼行號
__FILE__%s文件完整路徑
__PRETTY_FUNCTION__%s含簽名的函數名(C++/ObjC 更豐富)

Objective-C 專用運行時表達式

表達式格式說明
NSStringFromSelector(_cmd)%@當前選擇器名(方法名)
NSStringFromClass([self class])%@當前對象類名
[[NSString stringWithUTF8String:__FILE__] lastPathComponent]%@文件名(不含路徑)
[NSThread callStackSymbols]%@調用棧符號陣列(僅調試用)

實戰範例:打印方法與行號


NSMutableArray *someObject = [NSMutableArray array];
NSLog(@"%s:%d someObject=%@", __func__, __LINE__, someObject);
[someObject addObject:@"foo"];
NSLog(@"%s:%d someObject=%@", __func__, __LINE__, someObject);

輸出:

-[ViewController viewDidLoad]:12 someObject=()
-[ViewController viewDidLoad]:14 someObject=(foo)

進階:封裝通用日誌巨集


#define DLog(fmt, ...) NSLog((@"%s:%d " fmt), __func__, __LINE__, ##__VA_ARGS__)
#define DLogObj(obj) NSLog(@"%s:%d %@=%@", __func__, __LINE__, #obj, obj)

// 使用
DLog(@"userId=%d", userId);
DLogObj(someArray);

發布版禁用日誌


#ifdef DEBUG
#define DLog(fmt, ...) NSLog((@"%s:%d " fmt), __func__, __LINE__, ##__VA_ARGS__)
#else
#define DLog(...)
#endif

調試技巧組合拳


// 1. 斷點條件配合
// 2. 監控變量變化
// 3. 記憶體地址追蹤
NSLog(@"obj=%p, retainCount=%lu", obj, (unsigned long)[obj retainCount]);

// 4. 方法調用鏈
NSLog(@"Stack:\n%@", [NSThread callStackSymbols]);

注意事項

  • __func__ 在 ObjC 方法中返回 -[Class method] 格式
  • _cmd 是隱式參數,無需聲明直接用
  • callStackSymbols 性能較差,**僅調試使用,勿上線**
  • 發布構建務必禁用詳細日誌,避免洩露敏感信息

總結

將 __func__、__LINE__、_cmd、self.class 組合進日誌巨集,實現「零成本」上下文感知日誌,是專業 iOS/macOS 開發者必備技能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved