當我嘗試測試在較新版本的OS中引入的符號時,我遇到了一個奇怪的問題。我按照Apple guidelines使用弱鏈接符號,即在iOS中測試弱鏈接符號不能正常工作
檢查外部(EXTERN)的可用性不變或 通知名稱通過明確地比較其地址,而不是 符號裸露的名稱爲NULL或零。
重現此問題,我使用默認編譯器(Apple LLVM編譯器4.1)在最新的Xcode 4.5.2上使用最新的iOS 6 SDK。我弱化了社交框架(僅適用於iOS 6+)。和我運行在iOS 5.1這個代碼(部署目標是低於6):
NSLog(@"%p", &SLServiceTypeFacebook);
if (&SLServiceTypeFacebook)
NSLog(@"Yes1");
if (&SLServiceTypeFacebook != NULL)
NSLog(@"Yes2");
的輸出是:
0x0
Yes1
Yes2
換句話說,我們可以在運行時驗證該表達&SLServiceTypeFacebook
求值到0的值。然而,對此表達式進行測試的if
語句將它看作是真實的。
更新: 從this question,我發現這個變通辦法,沒有優化,但與優化:
typeof(&SLServiceTypeFacebook) foo = &SLServiceTypeFacebook;
if (foo)
NSLog(@"Yes3"); // does not get executed on -O0, but does on any optimization
更新: 它似乎這個問題沒有n不存在UIKit符號。運行在iOS 4.3以下幾點:
NSLog(@"%p", &UIKeyboardDidChangeFrameNotification);
if (&SLServiceTypeFacebook)
NSLog(@"Yes1");
if (&SLServiceTypeFacebook != NULL)
NSLog(@"Yes2");
輸出是:
0x0
我假設的區別是,UIKit的符號具有NS_AVAILABLE_IOS()
宏旁邊,這樣莫名其妙的編譯器能夠正確地處理它。在社交框架符號的情況下,它沒有NS_AVAILABLE_IOS()
宏,因爲整個社交框架本身僅在iOS 6以後纔可用(即該框架的版本之後可用的符號,所以我猜不需要這個宏?);但是然後編譯器不能正確處理該符號。
不應第一行是'的NSLog(@ 「%P」,SLServiceTypeFacebook)''那裏是SLServiceTypeFacebook'一個指針? –
@RoboticCat:不,不可用的弱鏈接符號的地址是0,嘗試訪問該符號將導致段錯誤。 – user102008
好的 - 最後的想法(然後我出來的想法) - NSLog(@「%x」,&SLServiceTypeFacebook)呢? –