2012-11-26 46 views
1

我們有一個NSUUID類(我們提供聲明和實現)。我們成功地使用了它到iOS 6.0。我們實施它,是因爲UIDevice uniqueIdentifier早在Apple棄用它之前就被禁止了,並且返回一個NSUUID是一個很自然的選擇。NSUUID衝突(iOS6.0及以上)

在的iOS 6.0,我們不得不警惕的定義,因爲蘋果推出了同一類:

#if __IPHONE_OS_VERSION_MAX_ALLOWED <= __IPHONE_5_1 
@interface NSUUID : NSObject { 
    ... 
} 
#endif 

的iOS 5.1和較小現在打破。在iOS 5.1上,我們在alloc/init之後返回nil

我試圖刪除#if/#end,但在使用最新的iPhone SDK時,我得到重複的名稱。

蘋果缺乏一個穩定的API是一個錯誤,而不是一個功能。這個「在運行時嘗試」的廢話並沒有削減它。這使得寫出高度完整的軟件變得非常困難。

從Tommy的回答下面,我不能指示Apple的工具鏈始終使用我們的NSUUID實現。如何爲iOS 5.1及更低版本提供NSUUID的實現(可能使用最新的SDK進行編譯)?

+0

是否有任何理由不能爲您的下一個版本重命名NSUUID?無論如何,你的用戶必須更新,因爲如果他們的二進制文件嘗試更新他們的iOS,他們的二進制文件將與他們的操作系統衝突 –

+0

這表現出發生Objective-C命名空間衝突的情況。也許蘋果保留的NS-前綴的不明智的使用是怪罪。 – ZhangChn

+0

我希望它可以在任何地方工作:'NSUUID * uuid = [DeviceUtils applicationIdentifier]'。這隻有在所有平臺上都有'NSUUID'的情況下才有效。在iOS 5.1及更低版本上,我們*提供*因爲缺失而提供。在這件事上沒有選擇。 – jww

回答

9

你不能。您已明確打破the rules

Objective-C類必須是唯一的[...]爲了保持 類名稱獨特,慣例是對所有類使用前綴。 你會注意到可可和可可觸摸類的名字通常是 或者NS或UI。像這樣的雙字母前綴是 Apple保留用於框架類。

您需要重新命名自己的班級。最快的方法很可能是右鍵單擊類名,選擇「重構 - >重命名...」,並使用正確的前綴。 Xcode可能無法完全自動重構,因爲它顯然不明確,您在代碼的其他部分所指的是NSUUID

編輯:無論譁衆取寵,如果你想實現的代碼,提供了一個自我實現的替代NSUUID它不可用,那麼解決方案是「在運行時嘗試」。

假設你已經實現了​​,它實現了相同的接口,然後NSUUID最快的解決辦法是這樣的添加到您的前綴頭:

#define NSUUID (NSClassFromString(@"NSUUID") ? [NSUUID class] : [NDRUUID class]) 

然後可以使用[NSUUID UUID]等,其他地方在你的代碼中,就好像你只針對iOS 6;唯一的區別是,在5下運行時,你實際上會處理​​。每當你停止支持5時,只需從你的前綴頭中刪除該行並從項目中刪除你自己的類。

希望你可以看到這是一個更好的方式來處理引入新的API和向後兼容性,比如在任何地方都不使用Apple的NSUUID,直到它到處可用。

+0

謝謝@Tommy。它不會幫助我們在所有情況下(iOS 6.0及更高版本,iOS 5.1及更低版本)。讓我改述一下:如何爲iOS 5.1及更低版本提供NSUUID的實現(可能使用最新的SDK進行編譯)。 – jww

+2

湯米已經回答了你的問題。重命名該類。這將適用於所有版本的iOS。 –

+0

@erurainon - 實際上,它不會。 iOS 5.1客戶端沒有NSUUID。所以它會失敗。 – jww

2

我已經準確地構建了您所要求的:iOS 5.1及更低版本的實現NSUUID,可能使用最新的SDK進行編譯。在GitHub上查看我的NSUUID項目。