ARCを有効にしたコードでUUID文字列を生成する必要があります。
いくつかの研究を行った後、これが私が思いついたものです:
CFUUIDRef uuid = CFUUIDCreate(NULL);
NSString *uuidStr = (__bridge_transfer NSString *)CFUUIDCreateString(NULL, uuid);
CFRelease(uuid);
__bridge_transfer
を正しく使用して、ARCの下のオブジェクトのリークを回避していますか?
私には問題ありません。これは私が使用するものです( 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
ただし、ほとんどの場合、ファイル名またはディレクトリ名に一意の文字列を生成するだけの場合は、次のようなNSProcessInfo
のgloballyUniqueString
メソッドを使用できます。
NSString *uuidString = [[NSProcessInfo processInfo] globallyUniqueString];
// generates 56341C6E-35A7-4C97-9C5E-7AC79673EAB2-539-000001F95B327819
正式なUUIDではありませんが、ネットワークとプロセスに固有であり、多くの場合に適しています。
それは私には正しいようです。
uuid
をCFReleaseしました。これはCFUUIDCreate()
からの責任です
そして、あなたは文字列の所有権をARCに移したので、コンパイラは適切な時にuuidStr
を解放することを知っています。
clang docs から:
(__bridge_transfer T)
opは、保持不可能なポインタ型でなければならないオペランドを、保持可能なオブジェクトポインタ型でなければならない宛先タイプにキャストします。 ARCは、ローカル値の通常の最適化に従って、囲まれた完全な式の最後に値を解放します。
だからあなたはそれを正しくやっている。