web-dev-qa-db-ja.com

ARCを有効にしてUUID文字列を生成します

ARCを有効にしたコードでUUID文字列を生成する必要があります。

いくつかの研究を行った後、これが私が思いついたものです:

CFUUIDRef uuid = CFUUIDCreate(NULL);
NSString *uuidStr = (__bridge_transfer NSString *)CFUUIDCreateString(NULL, uuid);
CFRelease(uuid);

__bridge_transferを正しく使用して、ARCの下のオブジェクトのリークを回避していますか?

71
Abhi Beckert

私には問題ありません。これは私が使用するものです( Gist として利用可能)

- (NSString *)uuidString {
    // Returns a UUID

    CFUUIDRef uuid = CFUUIDCreate(kCFAllocatorDefault);
    NSString *uuidString = (__bridge_transfer NSString *)CFUUIDCreateString(kCFAllocatorDefault, uuid);
    CFRelease(uuid);

    return uuidString;
}

編集して追加

OS X 10.8またはiOS 6を使用している場合、Core Foundationに移動することなく、新しい [〜#〜] nsuuid [〜#〜] クラスを使用して文字列UUIDを生成できます。

NSString *uuidString = [[NSUUID UUID] UUIDString];
// Generates: 7E60066C-C7F3-438A-95B1-DDE8634E1072

ただし、ほとんどの場合、ファイル名またはディレクトリ名に一意の文字列を生成するだけの場合は、次のようなNSProcessInfogloballyUniqueStringメソッドを使用できます。

NSString *uuidString = [[NSProcessInfo processInfo] globallyUniqueString];
// generates 56341C6E-35A7-4C97-9C5E-7AC79673EAB2-539-000001F95B327819

正式なUUIDではありませんが、ネットワークとプロセスに固有であり、多くの場合に適しています。

102
Abizern

それは私には正しいようです。

uuidをCFReleaseしました。これはCFUUIDCreate()からの責任です

そして、あなたは文字列の所有権をARCに移したので、コンパイラは適切な時にuuidStrを解放することを知っています。

42
Firoze Lafeer

clang docs から:

(__bridge_transfer T)opは、保持不可能なポインタ型でなければならないオペランドを、保持可能なオブジェクトポインタ型でなければならない宛先タイプにキャストします。 ARCは、ローカル値の通常の最適化に従って、囲まれた完全な式の最後に値を解放します。

だからあなたはそれを正しくやっている。

7
iHunter