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?
Ç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.
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é.
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.