2010-08-23 13 views
12

कृपया इस मेमोरी रिसाव के साथ मेरी मदद करें। लीक टूल में यह एक रिसाव दिखाता है: लाइब्रेरी Foundation में एनएससीएफस्ट्रिंग (32 बाइट्स) जिम्मेदार फ्रेम: NSPropertyListSerialization। मैं त्रुटि जारी कर रहा हूं लेकिन अभी भी एक रिसाव है। मैं क्या खो रहा हूँ? बहुत धन्यवाद!प्लिस्ट सीरियलाइजेशन के साथ मेमोरी लीक

NSPropertyListFormat format; 
    NSString *anError = nil; 
    id plist; 
    plist = [NSPropertyListSerialization propertyListFromData:rawCourseArray mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&anError]; 
    if (!plist){ 
      [anError release]; 
    } 
    NSArray *entries = (NSArray *)plist; 
    for (NSDictionary *entry in entries) 
    { 
     // DO SOMETHING 
    } 
+2

इस वहाँ बाहर हुए कहा कि यह एक सेब बग, कुछ NSPropertyListSerialization विकल्पों का उपयोग करने कहना है के बारे में विभिन्न पदों पर रहे हैं , लेकिन मुझे अभी तक एक अच्छा जवाब नहीं मिला है। –

+5

मुझे एक बग दिखाई देता है: आपको अपने कोड में '[anError रिलीज़]' नहीं करना चाहिए; आपके पास 'anError' के संदर्भ का स्वामित्व नहीं है। 'propertyListFromData: 'आपके कोड पर लौटने से पहले इसे स्वत: बंद कर देगा। हालांकि, यह एक * डबल-फ्री * बग है, न कि * रिसाव *। मुझे आपके द्वारा पोस्ट किए गए कोड में कोई रिसाव दिखाई नहीं देता है। – Quuxplusone

+0

डीबगर में, स्ट्रिंग का मान पीओ जो यह देखने के लिए लीक हो रहा है कि यह आपको कोई संकेत देता है या नहीं। –

उत्तर

0

बयान plist = [NSPropertyListSerialization propertyListFromData:rawCourseArray mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&anError]; एक autorelease वस्तु बनाता है। यदि आपका कोड अब एक अलग थ्रेड में चलता है जिस पर कोई ऑटोरेलीज पूल स्पष्ट रूप से @autoreleasepool {...} द्वारा असाइन नहीं किया गया है, तो यह ऑब्जेक्ट कभी जारी नहीं किया जा सकता है और यह रिसाव होगा।
तो, कृपया सुनिश्चित करें कि यदि आपका कोड अलग थ्रेड में चलता है तो आपने एक ऑटोरेलीज पूल सेट अप किया है।

1

सबसे पहले, सुनिश्चित करें कि आप बहिष्कृत या अप्रचलित विधि कॉल का उपयोग नहीं कर रहे हैं। आपके ऐप कॉन्फ़िगरेशन के आधार पर (यह आपके लिए निर्णय लेना है) आप अप्रचलित विधि कॉल का उपयोग कर रहे हैं; एप्पल डॉक्स से:

propertyListFromData:mutabilityOption:format:errorDescription: 

This method is obsolete and will be deprecated soon. (Deprecated. Use propertyListWithData:options:format:error: instead.)

मैं सिफारिश API कॉल ... टेस्ट संहिता उपयोग करने के बाद एक स्मृति रिसाव का पता नहीं चला:

NSArray *somearray = @[@"One",@"Two",@"Three"]; 
NSData *rawCourseArray = [NSKeyedArchiver archivedDataWithRootObject:somearray]; 

NSPropertyListFormat format; 
NSError *anError = nil; 
id plist; 
plist = [NSPropertyListSerialization propertyListWithData:rawCourseArray options:NSPropertyListImmutable format:&format error:&anError]; 
if (!plist){ 
    [anError release]; 
} 
NSArray *entries = (NSArray *)plist; 
for (NSDictionary *entry in entries) 
{ 
    // DO SOMETHING 
    NSLog(@"%@",entry); 
} 
+0

+1 अप्रचलित विधि को ध्यान में रखते हुए, जो वास्तव में समस्या हो सकती है। लेकिन, कृपया '[त्रुटि रिलीज]' लाइन को हटाएं, बहुत धन्यवाद;) – Tricertops

+0

'propertyListWithData: विकल्प: प्रारूप: त्रुटि:' एक रिसाव भी है। – Leandros

0

इस प्रयास करें हम अस्थायी में शब्दकोश मिल द्वारा

NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath]; 
    NSString *errorDesc = nil; 
    NSPropertyListFormat format; 
    NSDictionary *temp = (NSDictionary *)[NSPropertyListSerialization propertyListFromData:plistXML mutabilityOption:NSPropertyListMutableContainersAndLeaves format:&format errorDescription:&errorDesc]; 
    if (!temp) 
    { 
     NSLog(@"Error reading plist: %@, format: %d", errorDesc, format); 
    } 
0

कोई रिसाव नहीं है। यह सुनिश्चित करने के लिए सभी को एक @autoreleasepool में लपेटें ताकि एक चीज के रूप में तुरंत ऑटोरेलेस्ड हो जाए।

फिर एनेर के डबल फ्री के कारण होने वाली संभावित दुर्घटना से छुटकारा पाएं: यह स्वत: बंद है और आपको इसे फिर से रिलीज़ करने की आवश्यकता नहीं है!

0

कोशिश इस तरह अपनी plist को पढ़ने के लिए: JSON क्रमबद्धता को त्रुटि और अन्य लोगों का कहना है कि स्विच: प्रारूप:

NSDictionary *dTmp=[[NSDictionary alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"data" ofType:@"plist"]]; 


self.myarray=[dTmp valueForKey:@"Objects"]; 
संबंधित मुद्दे