Сгенерировать строку UUID с включенной ARC

#ios #objective-c #core-data #nsmanagedobject

#objective-c #автоматический подсчет ссылок

Вопрос:

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

После проведения некоторых исследований, это то, что я придумал:

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

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

Ответ №1:

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

 - (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, но он уникален для вашей сети и вашего процесса и является хорошим выбором для многих случаев.

Комментарии:

1. Привет! Большое спасибо за ваш ответ. Но в чем основное различие между идентификаторами, сгенерированными с NSUUID помощью и NSProcessInfo ?

2. @Artem NSProcessInfo возвращает String значение, а не a UUID . Кроме того, гарантируется, что она уникальна только для одного и того же процесса. Полезно, если вам просто нужна уникальная строка.

Ответ №2:

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

У вас есть Cfrelease’ uuid d, за что вы несете ответственность с момента CFUUIDCreate()

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

Ответ №3:


Из документов clang:

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

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