утечка памяти при разборе данных - PullRequest
1 голос
/ 14 июля 2011

Я пытаюсь проанализировать XML-файл.Я создаю массив словарей, а затем с этими созданными массивами я создаю массив с массивами.У меня возникают утечки памяти при копировании моего nsdictionary в массив.Может ли кто-нибудь, пожалуйста, помогите!Спасибо

enter image description here

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{

if(parseMode == 1){
    //        NSLog(@"found this start tag: %@", elementName);
    if ([elementName isEqualToString:@"Group"]) {
        [tInState removeAllObjects];
    }
    else if ([elementName isEqualToString:@"State_Name"]) {
        tData = [[NSMutableDictionary alloc] init];
        xmlItem = 0;
    }
    else if ([elementName isEqualToString:@"T_Name"]) {
        xmlItem = 1;
    }
    else if ([elementName isEqualToString:@"T_Address"]) {
        xmlItem = 2;
    }
    else if ([elementName isEqualToString:@"T_Ph"]) {
        xmlItem = 3;
    }
}

}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{     

if (parseMode == 1) {
    //    NSLog(@"found this end tag: %@", elementName);
    if([elementName isEqualToString:@"T_Info"]) {            
        [tInState addObject:[tData copy]];
        [tData autorelease];
    }
    else if ([elementName isEqualToString:@"Group"]) {
        [tlist addObject:tInState];

    }                      
}

}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{

if (parseMode == 0) {
    [self addToStateList:string];   
}
else  if (parseMode == 1) {
    //       NSLog(@"found this character: %@", string);
    switch (xmlItem) {
        case 0:               
            [tData setValue:string forKey:@"State_Name"];
            break;
        case 1:               
            [tData setValue:string forKey:@"T_Name"];
            break;
        case 2:               
            [tData setValue:string forKey:@"T_Address"];
            break;
        case 3:               
            [tData setValue:string forKey:@"T_Ph"];
            break;
        default:
            break;
    }        
}

}

Здесь tInState, tInStateЭто nsmutablearray, который я разместил в функции viewdidload и выпустил в releaseMemory.Я просмотрел документы NScopy и там говорится, что когда мы используем копию, право собственности передается.Я освобождаю все свои массивы, так почему это все еще вызывает проблему ??

Пожалуйста, помогите с этим.Спасибо

Ответы [ 2 ]

1 голос
/ 14 июля 2011

Причина вашей утечки в том, что tData делает то, что вы сказали, возвращая копию.Вызов autorelease для tData на следующей строке автоматически высвобождает исходные tData, и это приведет к избыточному выпуску.Вам нужно будет изменить эту строку на эту [tInState addObject:[[tData copy] autorelease]]; и удалить авто-выпускной вызов на следующей строке.

0 голосов
/ 14 июля 2011

В строке 81 вы создаете копию tData, но не выпускаете ее, поэтому она протекает.Вместо создания копии в вызове addObject присвойте ее переменной, затем передайте ее addObject, а затем отпустите.

id temp = [tData copy];
[tInState addObject:temp];
[temp release];

Кроме того, я предполагаю, что [tData autorelease]на самом деле предназначен для выпуска копии.Если это так, то в этом нет необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...