2011-12-30 7 views
71

ARCを有効にしたコードでUUID文字列を生成する必要があります。私が正しくARCの下で任意のオブジェクトをリークを避けるために__bridge_transferを使用してARCを有効にしてUUID文字列を生成する

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

アム:

は、いくつかの研究を行った後、これは私が思い付いたのですか? clang docsから

答えて

102

私によく見えます。これは、あなたがOS X 10.8またはiOS 6上にある場合は、文字列のUUIDを生成するために、新しいNSUUIDクラスを使用することができます

を追加する

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

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

    return uuidString; 
} 

gistとして入手可能)、私が使用しているもの編集しますCore Foundationのに行かなくても:

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ではないのですが、それはあなたのネットワークとあなたのプロセスに固有であり、多くのケースに適しています。その[NSProcessInfo globallyUniqueString]指示のための+1

+2

+1。 –

7

(__bridge_transfer T) OPが保持可能オブジェクトポインタ型である必要があり、宛先タイプに、非保持可能ポインタ型を有していなければならないオペランドを、キャスト。 ARCは、ローカル値の通常の最適化を条件に、囲み式の最後に値を解放します。

あなたは正しいことをしています。

42

それは私に正しいように見えます。

あなたはCFUUIDCreate()

から、あなたの責任ですCFRelease'd uuidを、持っていると、コンパイラが適切な時期にuuidStrを解放するために知っているので、あなたは、ARCに文字列の所有権を移転しました。

関連する問題