2010-08-23 23 views
12

Lütfen bu bellek sızıntısında bana yardımcı olun. Sızıntı aracında bir sızıntı gösterir: kitaplıktaki NSCFString (32 bayt) Foundation Sorumlu Çerçeve: NSPropertyListSerialization. Hatayı serbest bırakıyorum ama hala bir sızıntı. Neyi kaçırıyorum? Çok teşekkürler!Plist Serileştirme Özellikli Bellek Sızıntısı

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

bu orada bir elma böcek, bazı NSPropertyListSerialization seçenekleri kullanmak demek olduğunu söyleyerek ilgili çeşitli mesajlar vardır ama henüz büyük bir cevap bulamadım. –

+5

Tek bir hata görüyorum: Kodunuzda '' [anGrror release] 'yapmamalısınız; "anHata" referansına sahip değilsiniz. propertyListFromData: 'kodunuza dönmeden önce otomatik olarak yayınladı. Ancak, bu bir * çift serbest * hata, bir * kaçak * değil. Gönderdiğiniz kodda hiç sızıntı görmüyorum. – Quuxplusone

+0

Hata ayıklayıcısında, herhangi bir ipucu sunup sunmadığını görmek için sızan dizenin değeri. –

cevap

0

açıklamada plist = [NSPropertyListSerialization propertyListFromData:rawCourseArray mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&anError]; otomatik salma nesnesi oluşturur. Kodunuz artık otomatik olarak @autoreleasepool {...} tarafından hiçbir otomatikleştirme havuzunun atanmadığı ayrı bir iş parçacığında çalışırsa, bu nesne hiçbir zaman serbest bırakılamaz ve bir sızıntı olacaktır.
Yani, kodunuz ayrı bir iş parçacığında çalışıyorsa, lütfen bir otomatik kaldırma havuzu kurduğunuzdan emin olun.

1

İlk önce, kaldırılmış veya eskimiş yöntem çağrıları kullanarak olmadığını olun. Uygulama yapılandırmanıza bağlı olarak (bu karar vermeniz içindir) eski yöntem çağrılarını kullanıyor olabilirsiniz; Elma dokümanlardan:

propertyListFromData:mutabilityOption:format:errorDescription: 

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

ben tavsiye API çağrısı ... Testi Kodu kullandıktan sonra bir bellek sızıntısı tespit etmedi: Biz temp sözlüğü almak tarafından

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 Eski yöntemi fark ettiğiniz için, bu gerçekten sorun olabilir. Ancak, lütfen '[error release]' satırı, çok teşekkürler;) – Tricertops

+0

'propertyListWithData: options: format: error:' de bir sızıntı var. – Leandros

0

bu deneyin

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

hiçbir sızıntı yoktur. Otomatik olarak çalıştırılan her şeyin bir test olarak hemen uzaklaştığından emin olmak için bir @autoreleasepool'a sarın.

SONRA anError çifte serbest kaynaklanan potansiyel kazasında kurtulmak

: o autoreleased edilir ve tekrar serbest bırakmak zorunda yok!

0

deneyin bu şekilde sizin plist okumak için: format:: Hata ve diğerleri söylemek anahtarı JSON serileştirme

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


self.myarray=[dTmp valueForKey:@"Objects"];