Генерация строки UUID с включенным ARC - PullRequest
71 голосов
/ 31 декабря 2011

Мне нужно сгенерировать строку UUID в некотором коде с включенным ARC.

После некоторых исследований я пришел к следующему:

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

Правильно ли я использую __bridge_transfer чтобы не допустить утечки каких-либо предметов под ARC?

Ответы [ 3 ]

102 голосов
/ 06 мая 2012

выглядит хорошо для меня. Это то, что я использую (доступно как gist )

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

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

    return uuidString;
}

Отредактировано, чтобы добавить

Если вы используете OS X 10.8 или iOS 6, вы можете использовать новый класс NSUUID для генерации строкового UUID, не обращаясь к Core Foundation:

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

Но в большинстве случаев, если вы просто хотите сгенерировать уникальную строку для имени файла или каталога, вы можете использовать метод NSProcessInfo globallyUniqueString, например:

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

Это не формальный UUID, но он уникален для вашей сети и вашего процесса и является хорошим выбором для многих случаев.

42 голосов
/ 31 декабря 2011

Это выглядит правильно для меня.

У вас есть CFRelease'd uuid, который является вашей ответственностью от CFUUIDCreate()

И вы передали право собственности на строку в ARCпоэтому компилятор знает, что нужно выпустить uuidStr в соответствующее время.

7 голосов
/ 31 декабря 2011

С Ленточные документы :

(__bridge_transfer T) op переводит операнд, который должен иметь тип указателя без возможности сохранения, к типу назначения, который должен быть типом указателя сохраняемого объекта. ARC выпустит значение в конце полного выражения при условии обычной оптимизации локальных значений.

Так что вы все делаете правильно.

...