2012-04-18 109 views
1

我已經在xCode 4.3.2上使用了我的iPhone項目,並且運行良好。它使用NSUbiquitousKeyValueStore類,它的基礎SDK是iOS 5.0。 現在我要在xCode 3.2.5上構建我的項目,並且它說錯誤「未定義符號NSUbiquitousKeyValueStore」。 當然,我知道iOS 5.0支持NSUbiquitousKeyValueStore類,xCode 3.2.5不支持iOS 5.0。 因此,我想要禁用iOS 5.0以上的這些功能,並通過iOS 5.0啓用。 我該怎麼做?使用NSUbiquitousKeyValueStore生成xCode 3.2.5和xCode 4.3.2的xCode項目

回答

2

環繞,這使得與5.0 SDK中引入等,使得功能使用的代碼:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 50000 
    // Code using NSUbiquitousKeyValueStore goes here 
#endif 

注意,這是有條件的編譯。測試在構建時執行,而不是在運行時執行。因此,如果您在沒有5.0 SDK的情況下生成舊版Xcode,那麼無論您在哪裏運行它,生成的程序都將會使用從不使用NSUbiquitousKeyValueStore。沒有可行的方法來針對較舊的SDK進行構建,但如果它們在運行時可用,仍然會使用較新SDK的功能。

修改添加:有關更多信息,請參閱Apple的SDK Compatibility Guide

+0

謝謝你的回答。這正是我想知道的。 – ttotto 2012-04-18 07:58:12

0

您需要弱連接包含NSUbiquitousKeyValueStore類的框架。 然後在你的代碼做一些喜歡的東西:

if ([NSUbiquitousKeyValueStore class]) { 
    // Class wil return non nil uf the class exists. 
    NSUbiquitousKeyValueStore *NSUbiquitousKeyValueStore = [NSUbiquitousKeyValueStore new]; 
} 
+0

如果針對甚至沒有聲明「NSUbiquitousKeyValueStore」的SDK構建,仍然無法編譯。只有在您知道該符號的SDK進行編譯時纔會有效,但設置了一個早於該符號的部署目標。 – 2012-04-18 07:33:51

+0

確實,您需要將iOS部署目標設置得更低。 – rckoenes 2012-04-18 07:39:20

+1

不需要。關鍵是他正在構建一個根本不知道「NSUbiquitousKeyValueStore」的SDK。無論如何,你寫的東西都不會在這種情況下建立起來。您所概述的技術有助於實現不同的場景:當他構建一個足夠新的SDK但想要部署到較早的操作系統時。 – 2012-04-18 07:41:45