[英]NSUUID conflict (iOS6.0 and Above)
我們有一個NSUUID類(我們提供了聲明和實現)。 我們在iOS 6.0之前成功使用了它。 我們之所以實現它,是因為在蘋果不推薦使用UIDevice uniqueIdentifier
uniqueIdentifier之前就已將其禁用,並且自然而然地返回NSUUID。
在iOS 6.0上,我們必須保護定義,因為Apple引入了相同的類:
#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進行編譯)?
你不能 您已經明確違反了規則 :
daccess-ods.un.org daccess-ods.un.org為了保持類名的唯一性,必須對Objective-C類進行唯一命名,慣例是在所有類上使用前綴。 您會注意到Cocoa和Cocoa Touch類名稱通常以NS或UI開頭。 Apple保留了此類的兩個字母的前綴,供在框架類中使用。
您需要重命名自己的班級。 最快的方法很可能是右鍵單擊類名稱,選擇“重構->重命名...”,這次使用正確的前綴。 Xcode可能無法完全自動重構,因為它顯然在您代碼的其他部分所指的是哪個NSUUID
是模棱兩可的。
編輯:無論有NSUUID
,如果您想實現可提供NSUUID
自我替代功能的代碼,那么該解決方案是“在運行時嘗試”。
假設您實現了NDRUUID
,它實現了與NSUUID
相同的接口,那么最快的解決方案是在前綴標頭中添加以下內容:
#define NSUUID (NSClassFromString(@"NSUUID") ? [NSUUID class] : [NDRUUID class])
然后,您可以在代碼的其他任何地方使用[NSUUID UUID]
等,就好像您只針對iOS 6。 唯一的區別是,在5歲以下運行時,您實際上將尋址NDRUUID
。 每當您停止支持5時,只需從前綴標題中刪除該行,然后從項目中刪除您自己的類即可。
希望您能看到,這是處理引入新的API和向后兼容性的更好的方法,比之說,在任何地方都可以使用Apple的NSUUID之前,不要在任何地方使用它。
我已經完全按照您的要求構建了: NSUUID
於iOS 5.1及更低版本的NSUUID
的實現,可以使用最新的SDK進行編譯。 在GitHub上查看我的NSUUID項目。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.