Утечка памяти при использовании TBXML в Objective-C - PullRequest
0 голосов
/ 30 сентября 2011

Я новичок в Objective C и до сих пор не очень понимаю, как использовать retain и release.В следующем коде я хочу использовать TBXML для разбора файла XML и заполнения TableView.Код работает, но когда я «анализирую» мое приложение, Xcode говорит, что в переменной name есть утечки памяти.Я полагаю, что я должен выпустить переменную после ее сохранения, однако, всякий раз, когда я пытался выпустить ее, независимо от того, где я ее делаю, она всегда выдает ошибку.Я также пытался НЕ сохранить его, но он также выдал ошибку.

Может кто-нибудь объяснить, что здесь происходит?

- (void)loadNews {

    TBXML * tbxml = [[TBXML tbxmlWithURL:[NSURL URLWithString:@"http://www.abc/def.xml"]] retain];

    // If TBXML found a root node, process element and iterate all children
    if (tbxml.rootXMLElement) {

        TBXMLElement *categoryElement = [TBXML childElementNamed:@"category" parentElement:[tbxml rootXMLElement]];

        do {
            NSString *name = [TBXML valueOfAttributeNamed:@"name" forElement:categoryElement];
            [name retain]; // Something wrong with this line?

            NewsCategory *newsCategory = [[NewsCategory alloc] initWithCategoryName:name];

            // get entries in the category
            TBXMLElement *entryElement = [TBXML childElementNamed:@"entry" parentElement: categoryElement];

            do {
                NSString *title = [TBXML textForElement:[TBXML childElementNamed:@"title" parentElement:entryElement]];
                NSString * icon = [TBXML textForElement:[TBXML childElementNamed:@"icon" parentElement:entryElement]];
                NSString * link = [TBXML textForElement:[TBXML childElementNamed:@"link" parentElement:entryElement]];
                NSString * desc = [TBXML textForElement:[TBXML childElementNamed:@"desc" parentElement:entryElement]];

                NewsEntry *newsEntry = [[NewsEntry alloc] init];
                newsEntry.title = title;
                newsEntry.icon = icon;
                newsEntry.link = link;
                newsEntry.desc = desc;

                [newsCategory addEntry:newsEntry];

                [newsEntry release];
            } while((entryElement = entryElement->nextSibling));


            // save category
            [newsData addCategory:newsCategory];

            [newsCategory release];


        } while((categoryElement = categoryElement->nextSibling));


    }

    // release resources
    [tbxml release];


    [newsTableView reloadData];
}

1 Ответ

0 голосов
/ 30 сентября 2011

Если парни, создавшие [TBXML valueOfAttributeNamed: forElement:], следовали соглашению об именах, значение должно быть автоматически освобождено. Вам не нужно сохранять его.

Однако вам необходимо сохранить или скопировать его в методе [NewsCategory initWithCategoryName:].

...