2012-05-07 22 views
7

Có một vài ví dụ tốt về SO về CFUUID, đáng chú ý này:Làm cách nào để tạo một NSString CFUUID trong ARC không bị rò rỉ?

How to create a GUID/UUID using the iPhone SDK

Nhưng nó đã được thực hiện cho pre-ARC mã, và tôi không phải là một người nghiện CF (chưa), vì vậy có thể ai đó cung cấp mã ví dụ hoạt động với ARC?

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

Trả lời

23

Bạn muốn có một "cầu nối chuyển giao":

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

Các Transitioning to ARC Guide nói

__bridge_transfer hoặc CFBridgingRelease() di chuyển một tổ chức phi Objective-C con trỏ đến Objective-C và cũng chuyển quyền sở hữu đến ARC.

Tuy nhiên! Bạn cũng nên đổi tên phương thức của mình. ARC sử dụng các quy ước tên phương thức để giải thích về số lượng giữ lại và các phương thức bắt đầu bằng get trong Cocoa có ý nghĩa cụ thể liên quan đến việc truyền một bộ đệm để nó được lấp đầy dữ liệu. Tên tốt hơn là buildUUID hoặc một từ khác mô tả việc sử dụng UUID: pizzaUUID hoặc bearUUID.

+0

Cảm ơn Jacques, tôi nghĩ đó là __bridge nhưng không chắc chắn. Tôi vẫn không chắc chắn làm thế nào các chu kỳ giữ lại làm việc với CF, nhưng tôi sẽ nhận được nó một trong những ngày này. – TigerCoding

+0

Tìm kiếm chuỗi nhanh qua liên kết bạn cung cấp cho thấy chúng tôi không thể sử dụng từ "mới" nhưng tôi không thấy bất kỳ điều gì về việc sử dụng từ "get". Bạn đã nhầm lẫn giữa hai hay tôi đã bỏ lỡ điều gì đó? – TigerCoding

+0

Tôi thừa nhận rằng tôi không chắc chắn 100% rằng 'get' gây ra vấn đề với ARC (tôi đã có ý nghĩa để xem xét nó), nhưng đó là một quy ước đặt tên rất dài trong Cocoa. Xem '- [NSArray getObjects: range:]', '- [NSString getCharacters: phạm vi:]', và các giá trị khác. –

0

One-liner:

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

Điều này yêu cầu bạn phải có 'CFUUIDRef', không phải là trường hợp trong mã OP. –

5

Giả sử bạn không còn cần phải hỗ trợ iOS phiên bản cũ 6.0 vào thời điểm này, bạn có thể bỏ qua tất cả các UUID thứ Lõi Foundation và chỉ làm điều này để có được một tươi một:

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

Tôi đã sử dụng ứng dụng này trong các ứng dụng khác một thời gian sau đó. Quên tất cả về bài đăng này. – TigerCoding

+0

Điều này có trả về một chuỗi được định dạng chính xác như 'CFUUIDCreateString' không? –

+1

@ BenC.R.Leggiero Có. Định dạng kết cấu cho UUID là tiêu chuẩn. –

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