2011-12-30 8 views
71

Potrzebuję wygenerować ciąg UUID w pewnym kodzie z włączonym ARC.Wygeneruj ciąg UUID z włączonym ARC

Po robi jakieś badania, to co wymyśliłem:

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

Am I poprawnie używając __bridge_transfer aby uniknąć wyciek żadnych przedmiotów pod ARC?

Odpowiedz

102

Wygląda dobrze dla mnie. To właśnie używam (dostępny jako gist)

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

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

    return uuidString; 
} 

edytowane dodać

Jeśli jesteś na OS X 10.8 lub iOS 6 można użyć nowego NSUUID klasę do generowania UUID ciąg, bez konieczności przechodzenia do Fundacji Rdzeń:

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

Ale przede wszystkim, jeśli tylko chcą, aby wygenerować unikalny ciąg znaków dla nazwy pliku lub katalogu można użyć NSProcessInfo „s globallyUniqueString metoda jak:

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

To nie jest formalny UUID, ale jest unikatowy dla danej sieci i procesu i jest dobrym wyborem dla wielu przypadków.

+2

+1 dla wskazania [NSProcessInfo globallyUniqueString]. –

7

Od clang docs:

(__bridge_transfer T) op rzuca argument, który musi mieć zakaz Wygodne do przechowywania typ wskaźnika, od rodzaju przeznaczenia, które muszą być Wygodne do przechowywania typ obiektu wskaźnik. ARC zwolni wartość na końcu otaczającego wyrażenia pełnego, z zastrzeżeniem zwykłych optymalizacji lokalnych wartości.

Więc robisz to dobrze.

42

To mi odpowiada.

Masz CFRelease'd uuid, który jest odpowiedzialny z CFUUIDCreate()

A ty przeniesiono własność struny do ARC, więc kompilator wie, aby zwolnić uuidStr w odpowiednim czasie.