#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
значение, а не aUUID
. Кроме того, гарантируется, что она уникальна только для одного и того же процесса. Полезно, если вам просто нужна уникальная строка.
Ответ №2:
Для меня это выглядит правильно.
У вас есть Cfrelease’ uuid
d, за что вы несете ответственность с момента CFUUIDCreate()
И вы передали право собственности на строку ARC, поэтому компилятор знает, что нужно выпустить uuidStr
в соответствующее время.
Ответ №3:
Из документов clang:
(__bridge_transfer T)
op преобразует операнд, который должен иметь тип указателя, который не может быть сохранен, в тип назначения, который должен быть типом указателя на объект, который должен быть сохраняемым. ARC освободит значение в конце полного выражения, при условии обычной оптимизации локальных значений.
Итак, вы все делаете правильно.