2011-12-29 28 views
5

मैं एप्पल के नमूना कोड से KeyChainItemWrapper उपयोग कर रहा हूँ प्रमाणीकरण के लिए उपयोगकर्ता पासवर्ड स्टोर करने के लिए, लेकिन जब मैं इसे कहते पासवर्ड सेट करने की:स्मृति रिसाव KeychainItemWrapper

[keychain setObject:passwordField.text forKey:(id)kSecValueData]; 

यह सब मेरी शर्ट के ऊपर मेमोरी लीक dribbles । समस्या जाहिरा तौर पर वापस निशान KeyChainItemWrapper.m में 274 लाइन है, जो इस प्रकार है:

if (SecItemCopyMatching((CFDictionaryRef)genericPasswordQuery, (CFTypeRef *)&attributes) == noErr) 
{ 

कैसे मैं इसे ठीक होता है, और मैं और अधिक सावधान जब भविष्य में एप्पल नमूना कोड के साथ काम किया जाना चाहिए?

नोट: मैं अधिक कोड पोस्ट कर सकता हूं, लेकिन मैंने समस्या का उपयोग करके इस लाइन को समस्या को कम कर दिया है और पूर्ण नमूना कोड किसी भी डेवलपर के लिए आसानी से उपलब्ध है।

उत्तर

5

KeyChainItemWrapper के लिए कोड को देखते हुए, मैं सहमत हूं कि यह लाइन एक स्मृति रिसाव है। writeToKeychain के अंत में वे [attributes release] से चूक गए। इस फ़ाइल में SecItemCopyMatching() पर अन्य सभी कॉल देखें, उदाहरण के लिए कि वे लौटे-द्वारा-संदर्भ ऑब्जेक्ट को सही तरीके से कैसे जारी करते हैं।

मैं इस पृष्ठ के निचले हिस्से में त्रुटि को नोट करने के लिए "यह अच्छा है, लेकिन ..." लिंक का उपयोग करूंगा।

+0

वह वही था जहां समस्या थी। बस [विशेषताएं रिलीज] जोड़ें; लिंक प्लग के अंत में जो लिंक है। जैसा कि आपने सुझाव दिया है, इस बग को ऐप्पल को सूचित किया गया है। – Serendipity

+1

वाह - जहां तक ​​नमूना कोड जाता है, मुझे लगता है कि KeychainItemWrapper कुछ सबसे खराब है! हर जगह autoreleases, उपरोक्त सहित कम से कम 2 ज्ञात स्मृति रिसाव, और दूसरा एक keychainItemData प्रारंभिक ... – npellow

+0

npellow, autoreleases के साथ क्या गलत है? वे बस कुछ बिंदु पर रिलीज।ऐप्पल अक्सर उनका उपयोग करता है। असल में, वे कैसे चाहते हैं कि हम –

0

मुझे - (void) resetKeychainItem में एक और रिसाव मिला।

यह

self.pKeychainItemData = [[[NSMutableDictionary alloc] init] autorelease]; होना चाहिए।

+2

प्रोग्राम करें 'self.pKeychainItemData = [NSMutableDictionary dictionary] क्यों नहीं? बहुत साफ ... –

3

स्टेटिक विश्लेषण KeyChainItemWrapper.m की विधि रीसेटकेचैनइटम, लाइन 1 9 1 में ऑब्जेक्ट पर संभावित रिसाव की रिपोर्ट कर रहा है। हैरानी की बात यह है कि यह ऊपर दिए गए क्षेत्र में संभावित रिसाव की रिपोर्ट नहीं करता है, हालांकि मैंने ऑब्जेक्ट को जारी किए गए अनुसार, और शुद्धता के लिए जोड़ा है।

यहाँ रिसाव के साथ कोड रिपोर्ट की जा रही है:

- (void)resetKeychainItem 
{ 
    ... 
    // Default attributes for keychain item. 
    [keychainItemData setObject:@"" forKey:(id)kSecAttrAccount]; // <-- Potential leak of an object 
    [keychainItemData setObject:@"" forKey:(id)kSecAttrLabel]; 
    [keychainItemData setObject:@"" forKey:(id)kSecAttrDescription]; 

    // Default data for keychain item. 
    [keychainItemData setObject:@"" forKey:(id)kSecValueData]; 
} 

यह समस्या रिक्त स्ट्रिंग @ "" पर सूचना दी जा रही है। मैंने इस समस्या को हल करने और "ठीक करने" के लिए कई प्रकार के कोड कार्यान्वयन की कोशिश की, लेकिन कुछ भी काम नहीं करता है।

क्या यह एक झूठी सकारात्मक है?

अद्यतन: पोस्ट करने के ठीक बाद मुझे एहसास हुआ कि मैं त्रुटि का पता लगाने के लिए चेतावनी पर डबल-क्लिक कर सकता हूं।

यह चेतावनी शब्दकोश आवंटित करने के लिए यह ऊपर लाइन को जिम्मेदार ठहराया है:

if (!keychainItemData) 
{ 
    self.keychainItemData = [[[NSMutableDictionary alloc] init] autorelease]; 
} 

विश्लेषक चेतावनी नहीं रह गया है मौजूद है:

if (!keychainItemData) 
{ 
    self.keychainItemData = [[NSMutableDictionary alloc] init]; 
} 

मैं निम्नलिखित करने के लिए कोड बदल दिया है।

संबंधित मुद्दे