2011-12-30 40 views
71

Tôi cần tạo chuỗi UUID trong một số mã có bật ARC.Tạo chuỗi UUID với ARC được bật

Sau khi thực hiện một số nghiên cứu, đây là những gì tôi đã đưa ra:

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

Am tôi một cách chính xác bằng __bridge_transfer để tránh rò rỉ bất kỳ đối tượng dưới ARC?

Trả lời

102

Có vẻ ổn với tôi. Đây là những gì tôi sử dụng (có sẵn như là một gist)

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

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

    return uuidString; 
} 

Edited để thêm

Nếu bạn đang trên OS X 10.8 hoặc iOS 6 bạn có thể sử dụng lớp mới NSUUID để tạo ra một UUID chuỗi, mà không cần phải đi đến Core Foundation:

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

Nhưng hầu hết, nếu bạn chỉ muốn tạo ra một chuỗi duy nhất cho một tập tin hoặc thư mục tên sau đó bạn có thể sử dụng NSProcessInfo 's globallyUniqueString phương pháp như:

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

Nó không phải là một UUID chính thức, nhưng nó là duy nhất cho mạng của bạn và quá trình của bạn và là một lựa chọn tốt cho nhiều trường hợp.

+2

+1 cho chỉ báo [NSProcessInfo globalUniqueString] đó. –

7

Từ clang docs:

(__bridge_transfer T) op phôi các toán hạng, mà phải có kiểu con trỏ không retainable, để loại đích, mà cần phải có một loại con trỏ đối tượng retainable. ARC sẽ giải phóng giá trị ở cuối biểu thức đầy đủ kèm theo, tùy thuộc vào các tối ưu hóa thông thường trên các giá trị cục bộ.

Vì vậy, bạn đang làm đúng.

42

Điều đó có vẻ đúng với tôi.

Bạn có CFRelease'd uuid, đó là trách nhiệm của bạn từ CFUUIDCreate()

Và bạn đã chuyển quyền sở hữu của chuỗi để ARC, vì vậy trình biên dịch biết để phát hành uuidStr tại thời điểm thích hợp.

Các vấn đề liên quan