2011-12-30 10 views
71

के साथ एक यूयूआईडी स्ट्रिंग जेनरेट करें मुझे एआरसी सक्षम के साथ कुछ कोड में यूयूआईडी स्ट्रिंग जेनरेट करने की आवश्यकता है।एआरसी सक्षम

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

Am मैं सही ढंग से __bridge_transfer का उपयोग कर एआरसी के तहत किसी भी वस्तुओं लीक से बचने के लिए:

कुछ शोध करने के बाद, यह है कि क्या मैं के साथ आया है?

उत्तर

102

मुझे ठीक लग रहा है। यह, मैं क्या उपयोग करें (उपलब्ध एक gist के रूप में)

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

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

    return uuidString; 
} 

संपादित

जोड़ने के लिए ओएस एक्स 10.8 पर हैं या iOS 6 आप एक स्ट्रिंग UUID उत्पन्न करने के लिए नई NSUUID वर्ग का उपयोग कर सकते हैं है कोर फाउंडेशन में जाने के लिए बिना:

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

लेकिन ज्यादातर, अगर आप सिर्फ एक फ़ाइल या निर्देशिका नाम के लिए एक अद्वितीय स्ट्रिंग उत्पन्न करना चाहते हैं तो आप उपयोग कर सकते हैं NSProcessInfo के +०१२३७७५२९६विधि की तरह:

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

यह एक औपचारिक UUID नहीं है, लेकिन यह अपने नेटवर्क और अपनी प्रक्रिया के लिए अद्वितीय है और मामलों का एक बहुत के लिए एक अच्छा विकल्प है।

+2

+1 [NSProcessInfo globallyUniqueString] संकेत के लिए +1। –

7

clang docs से:

(__bridge_transfer T) सेशन संकार्य, जो, गैर retainable सूचक प्रकार होना आवश्यक है गंतव्य प्रकार है, जो एक retainable वस्तु सूचक प्रकार होना चाहिए करने के लिए डाले। एआरसी स्थानीय मूल्यों पर सामान्य अनुकूलन के अधीन, संलग्न पूर्ण अभिव्यक्ति के अंत में मूल्य जारी करेगा।

तो आप इसे सही कर रहे हैं।

42

यह मेरे लिए सही लग रहा है।

आप CFRelease'd uuid, जो CFUUIDCreate()

से आपकी जिम्मेदारी है और तुम एआरसी को स्ट्रिंग के स्वामित्व स्थानांतरित कर दिया है, इसलिए संकलक उचित समय पर uuidStr जारी करने के लिए जानता है।