Я новичок в 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];
}