簡體   English   中英

NSUUID沖突(iOS6.0及更高版本)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM