문제

나는 XML 문서 중 하나를 파싱하는 나쁜 메모리 누출로 고통 받고 있습니다.

NSXMLPARSER를 사용하여 각 노드 (아래 XML 샘플의 앨범)를 반복 한 다음 각 사진 노드를 반복하고 결과를 NSARRAY에 추가합니다.

각 루프에 2 개의 값을 저장하는 2 개의 유지 속성이 있습니다. 이 값은 각 사진 노드를 포함하는 다른 nsarray와 함께 nsmutabledictionary 객체에 추가됩니다. 결과 사전은 응용 프로그램의 다른 곳에서 사용하기 위해 NSARRAY에 추가됩니다.

응용 프로그램의 특정 지점에서 XML 문서를 다시로드하는 버튼이 있습니다. 다음에 호출되는 것은 누출이 발생할 때입니다. 악기에 NSCFARRAY가 표시되고 NSCFString이 누출되고 있으며 DidendElement에 나타납니다.

지구상에서 내가 잘못 가고있는 곳. 모든 조언은 도움이 될 것입니다.

- (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] forKey:@"photos"];

나는이 라인이 범인이라고 생각한다. 사본은 자동 조정되거나 릴리스되지 않으며, 파서가 A를 만날 때마다 교체했습니다. album 요소. 사용:

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

배열의 사본을 생성하고 있기 때문에 배열의 모든 객체도 유지 카운트가 증가하여 배열을 사전에서 덮어 쓸 수 없게되면 (사전에 포함시켜) 포함 된 배열이 해제되지 않습니다. 제대로, 배열도 마찬가지입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top