最近項目不是很緊了 所有閒時 看看其他的開發的語言 回味開發中遇到的一些 低級的錯誤 想起的 compare 這個逗逼
看代碼
#define IOS7_OR_LATER ( [[[UIDevice currentDevice] systemVersion] compare:@"7.0"] != NSOrderedAscending ) #define IOS8_OR_LATER ( [[[UIDevice currentDevice] systemVersion] compare:@"8.0"] != NSOrderedAscending ) #define IOS9_OR_LATER ( [[[UIDevice currentDevice] systemVersion] compare:@"9.0"] != NSOrderedAscending )
這段代碼肯定是正確的 沒有疑問的 拋開性能等等一切其他因素 但是到了 iOS10 的時候 我同事就被這個逗比坑了一回 (無言以對)
跟新iOS10的時候 在做相關版本適配的時候 逗逼習慣性的加上了這行代碼 (汗顏)
#define IOS10_OR_LATER ( [[[UIDevice currentDevice] systemVersion] compare:@"10.0"] != NSOrderedAscending )
最後上線後發現一啟動就會崩潰 拉出來查找各種情況 發現就是這個逗比compare 坑了
因為 compare 比較字符串的時候是按照 ascii碼來比較的 如果你的系統時10.0 的 那麼 “9.0”>”10.0”的
因該轉換為 浮點數再比較 這樣更加保險和可行些
#define kIOS_VERSION ([[[UIDevice currentDevice] systemVersion] floatValue]) #define kIOS7_OR_LATER (kIOS_VERSION >= 7.0) #define kIOS8_OR_LATER (kIOS_VERSION >= 8.0) #define KIOS9_OR_LATER (kIOS_VERSION >= 9.0) #define KIOS10_OR_LATER (kIOS_VERSION >= 10.0)