проект xcode - утечки памяти

Я пытаюсь устранить утечки памяти из своего проекта, но я застрял в двух ситуациях уже несколько дней.

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

    if (currentElement) {
        [currentElement release];
        currentElement = nil;
    }
    currentElement = [elementName copy];

    if ([elementName isEqualToString:@"item"]) {

        item = [[NSMutableDictionary alloc] init]; //leak #1

        // DOING OTHER STUFF....
        //......................
    }

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

    if ([elementName isEqualToString:@"item"]){

        [item setObject:currentTitle forKey:@"title"]; // leak #2
        [item setObject:currentLink forKey:@"link"];  //leak #3

        [bucket addObject:[item copy]]; // NSMutableArray *bucket
    }
}

Для утечки №1 я попытался выпустить элемент непосредственно перед выделением памяти, но если я это сделаю, приложение выйдет из строя. (Я имею в виду, как раз перед item = [[NSMutableDictionary alloc] init]; я использовал

if (item){
    [item release];
    item=nil;
}

В моем методе dealloc () у меня также есть [item release];

Что касается утечек №2 и №3, я понятия не имею, что происходит. Примечание: два метода вызываются синтаксическим анализатором XML при анализе файла XML каждый раз, когда элемент читается, то есть элемент NSMutableDictionary * повторно используется для каждого элемента.

Какие-либо предложения? Заранее спасибо :)


person CdB    schedule 01.03.2011    source источник


Ответы (1)


Как вы, кажется, знаете, общее правило состоит в том, что для evey copy, retain, alloc или new также должен быть release. Я думаю, что вы можете позвонить [[item copy] autorelease] и удалить предыдущую проверку, которая у вас есть.

Если это ничего не помогает, попробуйте проверить item != nil вместо if(item).

Также рассмотрите возможность использования двух других инструментов, «Build And Analyze» из меню «Build» и «NSZombie», чтобы найти другие утечки памяти. Кроме того, используйте Instumeny Leaks, чтобы узнать, какая библиотека вызывает утечку. Это может быть Apple или ваша собственная. Если он ваш, Leaks поможет его идентифицировать. В остальном это не твоя проблема.

person Moshe    schedule 01.03.2011
comment
Прежде всего, спасибо за ответ. Я уже пробовал автоматически разблокировать элемент, но утечка все еще не устранена. Использование Build And Analyze показало, что все в порядке ... - person CdB; 01.03.2011
comment
Я думаю, ваш чек не работает. Попробуйте проверить item != nil вместо if(item). - person Moshe; 01.03.2011
comment
Возможно, вы не дали мне решение напрямую, но вы заставили меня использовать NSZombie. Это указывало мне путь! Спасибо :) - person CdB; 01.03.2011
comment
Крис - поправка - я не заставлял вас что-либо делать. Я предложил. : p Я рад, что помог. - person Moshe; 01.03.2011
comment
уже сделал! Еще раз спасибо;) (P.S. принудительное происходит из-за плохого перевода греческого текста на английский: P) - person CdB; 01.03.2011