2012-05-07 12 views
7

Istnieje kilka dobrych przykładów na SO o CFUUID, zwłaszcza ten:Jak utworzyć CFUUID NSString pod ARC, który nie wycieka?

How to create a GUID/UUID using the iPhone SDK

Ale to było robione dla pre-ARC kodu i nie jestem ćpunem CF (jeszcze), więc można ktoś podać przykład kodu, który działa z ARC?

+ (NSString *)GetUUID 
{ 
    CFUUIDRef theUUID = CFUUIDCreate(NULL); 
    CFStringRef string = CFUUIDCreateString(NULL, theUUID); 
    CFRelease(theUUID); 
    return [(NSString *)string autorelease]; 
} 

Odpowiedz

23

chcesz "mostkiem przeniesienie":

+ (NSString *)GetUUID 
{ 
    CFUUIDRef theUUID = CFUUIDCreate(NULL); 
    CFStringRef string = CFUUIDCreateString(NULL, theUUID); 
    CFRelease(theUUID); 
    return (__bridge_transfer NSString *)string; 
} 

Transitioning to ARC Guide mówi

__bridge_transfer lub CFBridgingRelease() porusza non-objective-c wskaźnik do Objective-C i przenosi również własność do ARC.

Jednak! Powinieneś również zmienić nazwę swojej metody. ARC stosuje konwencje nazw metod, aby wnioskować o liczbie zatrzymań, a metody zaczynające się od get w kakao mają określone znaczenie związane z przekazywaniem bufora, aby uzyskać dane. Lepszą nazwą byłoby buildUUID lub inne słowo opisujące użycie UUID: pizzaUUID lub bearUUID.

+0

Dzięki Jacques, myślałem, że to __bridge, ale nie byłem pewien. Nadal nie jestem pewien, w jaki sposób cykle zatrzymania pracują z CF, ale do tego dojdzie jeszcze jeden z tych dni. – TigerCoding

+0

Szybkie wyszukiwanie ciągu za pomocą podanego linku pokazuje, że nie możemy użyć słowa "nowy", ale nie widziałem nic o używaniu słowa "get". Czy myliłeś tych dwóch, czy też coś przegapiłem? – TigerCoding

+0

Przyznaję, że nie jestem w 100% pewny, że 'get' powoduje problemy z ARC (miałem zamiar to przeanalizować), ale jest to bardzo długa konwencja nazewnictwa w Cocoa. Zobacz '- [NSArray getObjects: range:]', '- [NSString getCharacters: range:]' i inne. –

0

One-liner:

NSString *UUID = CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, CFUUIDCreate(NULL))); 
+0

To wymaga, abyś miał już 'CFUUIDRef', co nie ma miejsca w kodzie OP. –

5

zakładając, że nie są już potrzebne do wspierania iOS przed 6,0 ​​w tym momencie, można pominąć cały UUID rzeczy Foundation rdzenia i po prostu to zrobić, aby dostać świeże One:

NSString * uuidStr = [[NSUUID UUID] UUIDString]; 
+0

Po pewnym czasie korzystałem z tego w innych aplikacjach. Zapomniałem o tym wpisie. – TigerCoding

+0

Czy to zwraca ciąg sformatowany dokładnie jak 'CFUUIDCreateString'? –

+1

@ BenC.R.Leggiero Tak. Format tekstowy dla UUID jest standardem. –

Powiązane problemy