2012-05-07 11 views
7

ありCFUUID、特にこの1程度のSOのカップル良い例は次のとおりです。リークしないARCでCFUUID NSStringを作成するにはどうすればよいですか?

How to create a GUID/UUID using the iPhone SDK

しかし、それは前のARCコードのために作られた、と私は(まだ)CF中毒ないんだけど、そうすることができます誰かがARCで動作するサンプルコードを提供していますか?

あなたが "転送を架橋" したい
+ (NSString *)GetUUID 
{ 
    CFUUIDRef theUUID = CFUUIDCreate(NULL); 
    CFStringRef string = CFUUIDCreateString(NULL, theUUID); 
    CFRelease(theUUID); 
    return [(NSString *)string autorelease]; 
} 

答えて

23

+ (NSString *)GetUUID 
{ 
    CFUUIDRef theUUID = CFUUIDCreate(NULL); 
    CFStringRef string = CFUUIDCreateString(NULL, theUUID); 
    CFRelease(theUUID); 
    return (__bridge_transfer NSString *)string; 
} 

Transitioning to ARC Guide

__bridge_transferまたはCFBridgingRelease()のObjective-Cに非Objective-Cのポインタを移動しても所有権を転送すると言いますARCへ

!メソッドの名前を変更する必要があります。 ARCはメソッド名の規約を使用して保持カウントを推論し、Cocoaでgetで始まるメソッドには、バッファでデータを埋め込むという特定の意味があります。より良い名前は、buildUUIDまたはUUIDの使用を説明する別の単語:pizzaUUIDまたはbearUUIDです。あなたはもはやあなたがすべてのCore FoundationのUUIDのものをスキップしてちょうど新鮮なものを得るためにこれを行うことができ、この時点では6.0より前のiOSをサポートする必要がないと仮定すると

NSString *UUID = CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, CFUUIDCreate(NULL))); 
+0

ジャックに感謝します。私はそれが__bridgeだと思っていましたが、確信はありませんでした。 CFで保持サイクルがどのように機能するのかまだ分かりませんが、最近はその1つになるでしょう。 – TigerCoding

+0

あなたが提供したリンクを使ってすばやく文字列を検索すると、「新しい」という単語を使用することはできませんが、「取得」という単語の使用については何も表示されませんでした。あなたは2人を混乱させたのですか? – TigerCoding

+0

私は、「get」がARCに問題を引き起こすことは100%確信していないことを認めますが(私はそれを調べることを意味してきました)、これはCocoaの命名規則の長年にわたる命名です。 ' - [NSArray getObjects:range:]'、 ' - [NSString getCharacters:range:]'などを参照してください。 –

0

ワンライナー

NSString * uuidStr = [[NSUUID UUID] UUIDString]; 
+0

これはOPのコードには当てはまらない 'CFUUIDRef'を既に必要とします。 –

5

+0

私は他のアプリでこれを後で使ってしまいました。この投稿のすべてを忘れました。 – TigerCoding

+0

これは 'CFUUIDCreateString'のようにフォーマットされた文字列を返しますか? –

+1

@ BenC.R.Leggieroはい。 UUIDのテクスチャ形式は標準です。 –

関連する問題