Проект xcode - утечки памяти - PullRequest
0 голосов
/ 01 марта 2011

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

- (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, я понятия не имею,Примечание: эти 2 метода вызываются анализатором xml при синтаксическом анализе файла XML каждый раз, когда элемент читается. То есть элемент NSMutableDictionary * повторно используется для каждого элемента.

Есть предложения?Заранее спасибо:)

1 Ответ

0 голосов
/ 01 марта 2011

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

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

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

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