Iphone NSMutableDictionary中存在内存泄漏,NSXMLParser中存在NSArray

Iphone NSMutableDictionary中存在内存泄漏,NSXMLParser中存在NSArray,iphone,nsmutablearray,nsxmlparser,nsmutabledictionary,memory-leaks,Iphone,Nsmutablearray,Nsxmlparser,Nsmutabledictionary,Memory Leaks,我在解析一个xml文档时遇到了严重的内存泄漏问题 我正在使用NSXMLParser迭代每个节点(下面xml示例中的相册),然后迭代每个照片节点并将结果添加到NSArray 我有两个保留属性,在每个循环上存储两个值。这些值与包含每个照片节点的另一个NSArray一起添加到NSMutableDictionary对象。 生成的字典将添加到NSArray中,以便在应用程序的其他位置使用 我有一个按钮,可以在应用程序中的某些点重新加载xml文档。下一次调用是在发生泄漏时。仪器显示NSCFArray和NSC

我在解析一个xml文档时遇到了严重的内存泄漏问题

我正在使用NSXMLParser迭代每个节点(下面xml示例中的相册),然后迭代每个照片节点并将结果添加到NSArray

我有两个保留属性,在每个循环上存储两个值。这些值与包含每个照片节点的另一个NSArray一起添加到NSMutableDictionary对象。 生成的字典将添加到NSArray中,以便在应用程序的其他位置使用

我有一个按钮,可以在应用程序中的某些点重新加载xml文档。下一次调用是在发生泄漏时。仪器显示NSCFArray和NSCFString正在泄漏,并显示在DidendeElement中

我到底哪里做错了。任何建议都会有帮助

- (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];
}
}
这里是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] autorelease] forKey:@"photos"];
由于要创建数组的副本,因此数组中的所有对象的保留计数也会增加,因此如果数组变得不可访问(通过在字典中覆盖它),那么数组中包含的所有字符串都不会被正确释放,数组也不会被正确释放

我猜这条线是罪魁祸首。该副本从未自动释放或释放,只是在解析器每次遇到
相册
元素时被替换。使用:

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

由于要创建数组的副本,数组中的所有对象的保留计数也会增加,因此,如果数组变得不可访问(通过在字典中覆盖它),那么数组中包含的所有字符串都不会被正确释放,数组也不会被正确释放。

完成了。现在你已经指出了这一点,这是非常明显的。我已经在这里坐了3个小时,一直在修复内存泄漏,这是一个相当大的应用程序,我需要第二双眼睛。再次感谢,就这样。现在你已经指出了这一点,这是非常明显的。我已经在这里坐了3个小时,一直在修复内存泄漏,这是一个相当大的应用程序,我需要第二双眼睛。再次感谢。