#define kCountry "Country"; // 錯誤:含分號、缺 @
編譯器將分號視為宏定義一部分,展開時變為 @"Country"; 導致語法錯誤;且無 @ 前綴為 C 字串而非 NSString。
// 方式 1:宏定義 NSString 常量(推薦用 static const 替代)
#define kCountry @"Country" // 無分號、有 @
// 方式 2:靜態常量(類型安全、作用域可控、調試可見)
static NSString *const kCountry = @"Country"; // 放在 .m 文件頂部
// 方式 3:外部可見常量(.h 聲明 extern,.m 定義)
// .h: extern NSString *const kCountry;
// .m: NSString *const kCountry = @"Country";
float floatCountries = 74.2f; // 注意:OC 浮點字面量用點號,非逗號
[[NSUserDefaults standardUserDefaults] setFloat:floatCountries forKey:kCountry];
float test = [[NSUserDefaults standardUserDefaults] floatForKey:kCountry];
NSLog(@"%f", test); // 輸出 74.200000
| 特性 | #define | static const |
|---|---|---|
| 類型檢查 | 無(預處理文本替換) | 編譯期類型安全 |
| 調試器可見性 | 不可見(展開後無符號) | 可見(有符號表條目) |
| 作用域控制 | 無(全局文件級) | 文件級或模塊級 |
| 內存佔用 | 每次使用可能重複創建字面量 | 單一實例,編譯器優化 |
static NSString *const KEY = @"value"; 放在 .m 文件。extern NSString *const KEY;,.m 定義。#define MAX_COUNT 100),字串/對象用常量。KYUserDefaultsKeyLastLoginDate。