web-dev-qa-db-fra.com

Générer une chaîne UUID avec ARC activé

J'ai besoin de générer une chaîne UUID dans du code avec ARC activé.

Après avoir fait quelques recherches, voici ce que j'ai trouvé:

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

Suis-je correctement en utilisant __bridge_transfer pour éviter la fuite d'objets sous ARC?

71
Abhi Beckert

Ça me va bien. C'est ce que j'utilise (disponible en Gist )

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

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

    return uuidString;
}

Modifié pour ajouter

Si vous êtes sous OS X 10.8 ou iOS 6, vous pouvez utiliser la nouvelle classe NSUUID pour générer une chaîne UUID, sans avoir à aller à Core Foundation:

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

Mais surtout, si vous voulez simplement générer une chaîne unique pour un nom de fichier ou de répertoire, vous pouvez utiliser la méthode NSProcessInfo de globallyUniqueString comme:

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

Ce n'est pas un UUID formel, mais il est unique pour votre réseau et votre processus et est un bon choix pour de nombreux cas.

102
Abizern

Cela me semble correct.

Vous avez CFRelease'd uuid, qui est de votre responsabilité à partir de la CFUUIDCreate()

Et vous avez transféré la propriété de la chaîne à ARC, donc le compilateur sait libérer uuidStr au moment approprié.

42
Firoze Lafeer

De clang docs :

(__bridge_transfer T) op convertit l'opérande, qui doit avoir un type de pointeur non conservable, en type de destination, qui doit être un type de pointeur d'objet conservable. ARC libérera la valeur à la fin de l'expression complète englobante, sous réserve des optimisations habituelles sur les valeurs locales.

Vous le faites donc correctement.

7
iHunter