以下內容僅針對引數使用, 不包含方法檢查。通常來說, 遇到以下內容僅針對oc, swift不使用
#**ailable
無法通過編譯。說明部分均為推測, 沒有翻看彙編結果進行完備論證, 拋磚引玉。
api_**ailable
限制版本的引數, 使用@**ailable
就能完成判斷。
然而雲譎波詭, 是時候確確實實發生了通過版本檢查卻訪問變數崩潰的情況, 令人匪夷所思。
比如下面這個在網路型別判斷中使用引數:
#import coretelephony_extern nsstring * const ctradioaccesstechnologynrnsa api_**ailable(ios(14.1)) api_un**ailable(macos);
系統版本過低時, 直接呼叫會發生如下錯誤。
exc_bad_access (code=1, address=0x0)
最大的問題是, 即使通過了@**ailable(ios 14.1, *)
的檢查, 仍有可能在少數詭異的裝置上崩潰。雖然不可思議, 但這是事實。
if (&ctradioaccesstechnologynrnsa) else
對這些版本限制相關引數新增動態檢查。
一下內容均為我的腦補與胡扯, 缺乏嚴謹論證, 有待熟手指點。
一開始假設問題存在時, 任何顯式訪問ctradioaccesstechnologynrnsa
的行為都會造成崩潰。
考慮到引數定義與記憶體對其。
ctradioaccesstechnologyehrpd
ctradioaccesstechnologylte
ctradioaccesstechnologynrnsa
指標位址間隔相同。手動計算ctradioaccesstechnologynrnsa
指標位址, 但是arc下無法從記憶體位址直接還原nsstring *
指標, 失敗。
ctradioaccesstechnologynrnsa
內容為@"ctradioaccesstechnologynrnsa"
, 既然知道目標位址, 直接通過記憶體比較內容?
不知道具體實現, 只能說可以比較一部分, 但沒什麼卵用, 嘗試不出精確校驗的方法, 失敗。
萬念俱灰, 直接取位址。然鵝, 似乎可行。
盲猜是編譯優化, 或者程序虛擬記憶體對映啥的, 反正似乎能用了。
判斷 iOS 系統版本
system versioning preprocessor macros define system version equal to v uidevice currentdevice systemversion compare v options nsnumericsearch nsordere...
程式 判斷Windows作業系統的版本
02 判斷作業系統.cpp 此檔案包含 main 函式。程式執行將在此處開始並結束。include pch.h include include include using namespace std string getsystemname string name 未知作業系統 switch osi...
oracle建立修改系統引數後 不能啟動的問題
oracle記憶體配置 檔案 oracle home ora92 database spfiletianci.ora 檔案 實際是 spfilesid.ora檔案 sid是資料庫的服務 執行cmd 輸入 sqlplus nolog 輸入 conn 使用者名稱 密碼 as sysdba 拷貝 orac...