71 votes

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

J'ai besoin de générer une chaîne UUID dans un 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);

Est-ce que j'utilise correctement __bridge_transfer pour éviter les fuites d'objets sous ARC ?

102voto

Abizern Points 52378

Ça m'a l'air bien. C'est ce que j'utilise (disponible sous forme de 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 fonction NSUUID pour générer une chaîne UUID, sans devoir passer par 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 NSProcessInfo 's globallyUniqueString méthode comme :

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

Il ne s'agit pas d'un UUID formel, mais il est unique pour votre réseau et votre processus et constitue un bon choix dans de nombreux cas.

42voto

Firoze Lafeer Points 13596

Cela me semble correct.

Vous avez CFRelease'd uuid qui est votre responsabilité depuis le CFUUIDCreate()

Et vous avez transféré la propriété de la chaîne à ARC, de sorte que le compilateur sait qu'il faut libérer uuidStr au moment opportun.

7voto

iHunter Points 4308

Desde docs clang :

_(__bridge_transfer T)_ op convertit l'opérande, qui doit être de type pointeur non conservable, en type de destination, qui doit être de type pointeur d'objet conservable. ARC libère la valeur à la fin de l'expression complète, en tenant compte des optimisations habituelles sur les valeurs locales.

Donc vous faites bien les choses.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X