سؤال

أنا أعاني من تسرب الذاكرة السيئة واحدة من مستندات XML الخاصة بي.

أنا أستخدم NSXMLPARSER لتكرر كل عقدة (الألبوم في عينة XML أدناه)، ثم قم بتكرير كل عقدة صورة وإضافة النتيجة إلى NSArray.

لدي 2 خصائص مرتبطة، والتي تخزن قيمتين على كل حلقة. تتم إضافة هذه القيم إلى كائن NSMutablediction جنبا إلى جنب مع NSArray آخر يحتوي على كل عقدة صورة. تتم إضافة القاموس الناتج إلى NSArray لاستخدامه في مكان آخر في التطبيق.

لدي زر يقوم بإعادة تحميل مستند XML في نقاط معينة في التطبيق. في المرة القادمة التي يطلق عليها هي عندما تحدث التسريبات. تعرض الأدوات NSCFarray وتسرب NSCFSTRING وتظهر في DoDendelement.

حيث على الأرض أنا ذاهب خطأ. أي نصيحة قد تكون مساعدة.

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
if([elementName isEqualToString:@"photo"]){
    self.strPhotoPath = [attributeDict objectForKey:@"iphone"];
}else if ([elementName isEqualToString:@"album"]) {

    dicItem = [[[NSMutableDictionary alloc] init] autorelease];

    self.strCurrentTitle = [attributeDict objectForKey:@"band_name"];
    self.strCurrentLocation = [attributeDict objectForKey:@"location"];

}
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{   
if([elementName isEqualToString:@"photo"]){
    [self.arrPhotos addObject:self.strPhotoPath];
}else if ([elementName isEqualToString:@"album"]) {
    [dicItem setObject:self.strCurrentTitle forKey:@"album"];
    [dicItem setObject:self.strCurrentLocation forKey:@"location"];
    [dicItem setObject:[self.arrPhotos copy] forKey:@"photos"];

    [self.arrAlbums addObject:dicItem];

    [self.arrPhotos removeAllObjects];
}
}

إليك SNIP من XML.

<albums type='array'>
<album location='Album 1' date='2009-12-04 22:47:48 UTC' album_name='' band_name='Band 1'>
<photo display_on_website='true' standard='/system/photos/3396/original/Photo1-DSC8894.jpg' thumb='/system/photos/3396/thumb/Photo1-DSC8894.jpg' date='2009-12-04 22:47:48' exif_data='NIKON D300, F:2.8, Shutter:1/80, Focal:15mm, ISO:1600' iphone='/system/photos/3396/iPhone/Photo2-DSC8894.jpg' available_for_print='false'/>
<photo display_on_website='true' standard='/system/photos/3403/original/Photo2-DSC9146.jpg' thumb='/system/photos/3403/thumb/Photo3-DSC9146.jpg' date='2009-12-04 23:19:27' exif_data='NIKON D300, F:4.5, Shutter:1/160, Focal:70mm, ISO:1600' iphone='/system/photos/3403/iPhone/Photo3-DSC9146.jpg' available_for_print='false'/>
</album>
<album location='Album 2' date='2009-12-04 22:47:48 UTC' album_name='' band_name='Band 2'>
<photo display_on_website='true' standard='/system/photos/3396/original/Photo3-DSC8894.jpg' thumb='/system/photos/3396/thumb/Photo3-DSC8894.jpg' date='2009-12-04 22:47:48' exif_data='NIKON D300, F:2.8, Shutter:1/80, Focal:15mm, ISO:1600' iphone='/system/photos/3396/iPhone/Photo3-DSC8894.jpg' available_for_print='false'/>
<photo display_on_website='true' standard='/system/photos/3403/original/Photo4-DSC9146.jpg' thumb='/system/photos/3403/thumb/Photo4-DSC9146.jpg' date='2009-12-04 23:19:27' exif_data='NIKON D300, F:4.5, Shutter:1/160, Focal:70mm, ISO:1600' iphone='/system/photos/3403/iPhone/Photo4-DSC9146.jpg' available_for_print='false'/>
<photo display_on_website='true' standard='/system/photos/3403/original/Photo5-DSC9146.jpg' thumb='/system/photos/3403/thumb/Photo5-DSC9146.jpg' date='2009-12-04 23:19:27' exif_data='NIKON D300, F:4.5, Shutter:1/160, Focal:70mm, ISO:1600' iphone='/system/photos/3403/iPhone/Photo5-DSC9146.jpg' available_for_print='false'/>
</album>
</albums>
هل كانت مفيدة؟

المحلول

[dicItem setObject:[self.arrPhotos copy] forKey:@"photos"];

أعتقد أن هذا الخط هو كولبري. النسخة ليست أبدا autorelased أو صدرها، واستبدالها فقط في كل مرة يواجه المحلل فيها album جزء. يستخدم:

[dicItem setObject:[[self.arrPhotos copy] autorelease] forKey:@"photos"];

نظرا لأنك تقوم بإنشاء نسخة من الصفيف، فقد زادت جميع الكائنات الموجودة في الصفيف أيضا عدد الاحتفاظ بها، لذلك إذا أصبحت المجموعة غير قابلة للوصول (من خلال الكتابة فوقه في القاموس)، فإن جميع السلاسل التي لا يتم إصدار مجموعة متنقلة بشكل صحيح، ولا سوف الطريقة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top