2011-12-30 11 views
71

Necesito generar una cadena UUID en algún código con ARC habilitado.Generar una cadena UUID con ARC habilitado

Después de hacer algunas investigaciones, esto es lo que ocurrió:

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

Am I correctamente utilizando __bridge_transfer para evitar fugas de cualquier objeto en virtud de ARC?

Respuesta

102

Me parece bien. Esto es lo que yo uso (disponible como gist)

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

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

    return uuidString; 
} 

Editado para agregar

Si está en OS X 10.8 o iOS 6 se puede utilizar la nueva clase NSUUID para generar un UUID cadena, sin tener que ir a la Fundación núcleo:

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

Pero sobre todo, si lo que desea es generar una cadena única para un nombre de archivo o directorio, puede utilizar NSProcessInfo 's globallyUniqueString método como:

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

No es un UUID formal, pero es único para su red y su proceso y es una buena opción para una gran cantidad de casos.

+2

+1 para esa indicación [NSProcessInfo globallyUniqueString]. –

7

De clang docs:

(__bridge_transfer T) op arroja el operando, el cual debe tener un tipo de puntero no puede retener, con el tipo de destino, que debe ser un tipo de puntero de objeto puede guardar. ARC lanzará el valor al final de la expresión completa adjunta, sujeto a las optimizaciones habituales en los valores locales.

Así que lo estás haciendo bien.

42

Eso me parece correcto.

Tienes CFRelease'd uuid, que es su responsabilidad de la CFUUIDCreate()

Y que haya transferido la propiedad de la cadena de ARC, por lo que el compilador sabe para liberar uuidStr en el momento apropiado.