1

NSUUID クラスがあります (宣言と実装を提供します)。iOS6.0までは問題なく使えました。Apple が廃止するずっと前に禁止されていたため、実装しましUIDevice 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 では、 のnil後に戻りalloc/initます。

を削除しようとしました#if/#endが、最新の iPhone SDK を使用すると名前が重複します。

Apple に安定した API がないのはバグであり、機能ではありません。この「実行時に試してみる」がらくたはそれをカットしていません。これにより、整合性の高いソフトウェアを作成することが非常に困難になります。

以下の Tommy の回答から、Apple のツールチェーンに NSUUID の実装を常に使用するように指示することはできません。iOS 5.1 以前 (最新の SDK を使用してコンパイルされている可能性があります) 用の NSUUID の実装を提供するにはどうすればよいですか?

4

2 に答える 2

9

できません。あなたは明らかにルールを破っています:

Objective-C クラスは一意の名前を付ける必要があります [...] クラス名を一意に保つために、すべてのクラスでプレフィックスを使用するのが慣習です。Cocoa および Cocoa Touch のクラス名は通常、NS または UI で始まることに気付いたでしょう。このような 2 文字のプレフィックスは、フレームワーク クラスで使用するために Apple によって予約されています。

独自のクラスの名前を変更する必要があります。おそらく最も簡単な方法は、クラス名を右クリックし、「リファクタリング -> 名前の変更...」を選択して、今回は正しいプレフィックスを使用することです。NSUUIDコードの他の部分で参照しているものは明らかにあいまいであるため、Xcode は完全に自動的にリファクタリングできない場合があります。

編集:グランドスタンドに関係なく、利用できない場所に自己実装の代替品を提供するコードを実装したい場合NSUUID、解決策は「実行時に試す」ことです。

NDRUUIDと同じインターフェースを実装する を実装したと仮定するとNSUUID、最も簡単な解決策は、次のようなものをプレフィックスヘッダーに追加することです。

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

[NSUUID UUID]その後、iOS 6 のみをターゲットにしているかのように、コード内の他の場所で などを使用できます。唯一の違いは、5 未満で実行する場合、実際にアドレス指定することになりますNDRUUID。5 のサポートを停止するときはいつでも、プレフィックス ヘッダーからその行を削除し、プロジェクトから独自のクラスを削除してください。

Apple の NSUUID がどこでも利用可能になるまでまったく使用しないよりも、これが新しい API と後方互換性の導入を処理するためのはるかに優れた方法であることがお分かりいただけると思います。

于 2012-11-26T06:11:44.150 に答える
2

私はあなたが求めていたものを正確に構築しました:NSUUID最新のSDKを使用してコンパイルされる可能性のあるiOS5.1以下の実装。GitHubで私のNSUUIDプロジェクトを参照してください。

于 2013-01-09T16:05:13.083 に答える