2011-12-30 12 views
71

ARC를 사용하는 일부 코드에서 UUID 문자열을 생성해야합니다. 내가 제대로 ARC에서 물건을 누출 방지하기 위해 __bridge_transfer를 사용하여ARC를 사용하는 UUID 문자열 생성

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

암 :

몇 가지 연구를하고 후이 내가 생각 해낸 무엇인가? clang docs에서

답변

102

나에게 잘 어울립니다. 이것은 당신이 OS X 10.8에있는 또는 iOS 사용자가 문자열 UUID를 생성하는 새로운 NSUUID 클래스를 사용 가능한 6 개의 경우 내가

을 추가 (A gist로 사용 가능)

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

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

    return uuidString; 
} 

편집을 사용하는 것입니다 코어 재단에 갈 필요없이 :

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

을하지만 그냥 파일이나 디렉토리 이름에 대한 고유 한 문자열을 생성 할 경우 대부분, 당신은 사용할 수 있습니다 NSProcessInfogloballyUniqueString 방법 같은 :

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

그것은 공식적인 UUID 아니지만, 네트워크 및 프로세스에 대한 고유하고 많은 경우를위한 좋은 선택이 될 것입니다. 해당 [NSProcessInfo globallyUniqueString] 표시에 대해

+2

+1 –

7

:

(__bridge_transfer T) 영업 이익은 보존 가능한 개체 포인터 유형이어야합니다 대상 종류로, 비 보존 가능한 포인터 타입이 있어야합니다 피연산자를 던진다. ARC는 지역 값에 대한 일반적인 최적화가 적용되는 경우 전체 둘러싸 기식의 끝 부분에서 값을 릴리스합니다.

그래서 제대로하고 있습니다.

42

나에게 맞는 것 같습니다.

당신은 CFUUIDCreate()

에서 사용자의 책임입니다 CFRelease'd uuid을 가지고 그리고 컴파일러는 적절한 시간에 uuidStr을 해제 알 수 있도록 당신이, ARC에 문자열의 소유권을 이전했습니다.

관련 문제