說明
原文僅包含一張圖片,無文字內容。此處提供 Objective-C 常用數據類型與 NSLog/printf 格式化符號對照表,作為補充參考。
基本數據類型對照
| Objective-C 類型 | 底層 C 類型 | 位寬 | 格式化符號 | 示例 |
NSInteger | long / int | 32/64位隨架構 | %ld / %d | NSInteger i = 42; |
NSUInteger | unsigned long / unsigned int | 32/64位 | %lu / %u | NSUInteger u = 100; |
CGFloat | float / double | 32/64位 | %f / %g | CGFloat f = 3.14; |
BOOL | signed char | 8位 | %d (0/1) | BOOL b = YES; |
unichar | unsigned short | 16位 | %hu / %C | unichar c = '中'; |
Foundation 常用對象類型
| 類型 | 描述 | NSLog 格式化 | 說明 |
NSString* | 不可變字符串 | %@ | 調用 description 方法 |
NSNumber* | 數值包裝 | %@ | 自動推導數值類型 |
NSArray* | 有序集合 | %@ | 打印所有元素 |
NSDictionary* | 鍵值映射 | %@ | 打印鍵值對 |
NSDate* | 日期時間 | %@ | 標準 ISO8601 格式 |
NSURL* | 資源定位符 | %@ | 打印 URL 字符串 |
id | 任意對象指針 | %@ | 通用對象打印 |
Class | 類對象 | %@ | 打印類名 |
SEL | 選子(方法名) | %@ | 打印方法名如 setName: |
指針與地址打印
| 類型 | 格式化符號 | 示例 |
對象指針 id/NSObject* | %p | NSLog(@"ptr=%p", obj); |
C 指針 void* | %p | printf("ptr=%p", ptr); |
平台相關注意事項
- 32 位 vs 64 位:
NSInteger/NSUInteger/CGFloat 在 64 位下為 long/double,32 位下為 int/float。統一使用 %ld/%lu/%f 並在編譯期通過宏適配:
#if __LP64__
#define NSIntegerFormat "%ld"
#define NSUIntegerFormat "%lu"
#else
#define NSIntegerFormat "%d"
#define NSUIntegerFormat "%u"
#endif
NSLog(@"value: " NSIntegerFormat, myNSInteger);
NSLog vs printf
NSLog:輸出到系統日誌(Console.app 可見),自動帶時間戳、進程名、線程號,**僅支援 %@、%ld 等少量格式**,不支援 %zu、%td 等 C99 格式。
printf/fprintf(stderr,...):標準 C 輸出,格式完整支援,高性能,適合熱路徑日誌。
總結
Objective-C 類型系統建立在 C 之上,掌握底層 C 類型對應關係是正確格式化輸出的關鍵。統一使用 %@ 打印對象,基本類型根據架構選擇 %ld/%lu/%f,調試指針用 %p。