我正在接收可追溯至以下方法的NSCFSting泄漏。我解析XML文件,并使用从textForElement获取的字符串并将它们设置为对象中的变量(EventArticleObject)。我知道泄漏不是来自textForElement,因为我没有在另一个解析方法中泄漏,我没有将字符串设置为对象。将字符串泄露给对象时泄漏
我正在填充的数组和字典没有被泄漏,它只是字符串。当我转到堆栈跟踪并单击其中一个泄漏字符串时,显示如下: pic http://img820.imageshack.us/img820/9456/screenshot20110512at939.png #2 CFRetain在下面的方法中追溯到setLink,这就是我相信我在做错某事的时候使用对象。
有没有人看到我在这里做错了什么?非常感谢!
//Parse the weekly events are store. Must first get the date, format it, and attach it to
// the link; this is to get the events for the current week.
- (void)parseWeekEvents
{
TBXML *tbxml;
TBXMLElement *rootXMLElement;
TBXMLElement *node_channel;
TBXMLElement *node_item;
TBXMLElement *node_traverse;
NSString *fullEventURL;
fullEventURL = @"http://www.millersville.edu/calendar/rss.php?q=&c=&date=";
fullEventURL = [fullEventURL stringByAppendingString:dateURL];
fullEventURL = [fullEventURL stringByAppendingString:@"&mode=week"];
eventsDict = [[NSMutableDictionary alloc] init];
datesArray = [[NSMutableArray alloc] init];
tbxml = [TBXML tbxmlWithURL:[NSURL URLWithString:fullEventURL]];
rootXMLElement = tbxml.rootXMLElement;
if(rootXMLElement)
{
node_channel = [TBXML childElementNamed:@"channel" parentElement:rootXMLElement];
if(node_channel)
{
node_item = [TBXML childElementNamed:@"item" parentElement:node_channel];
while(node_item)
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
EventArticleObject *currentEvent = [[[EventArticleObject alloc] init] autorelease];
NSString *title;
NSString *link;
NSString *date;
node_traverse = [TBXML childElementNamed:@"title" parentElement:node_item];
title = [TBXML textForElement:node_traverse];
title = [title stringByReplacingOccurrencesOfString:@"&" withString:@"&"];
title = [title stringByReplacingOccurrencesOfString:@"'" withString:@"'"];
[currentEvent setTitle:title];
node_traverse = [TBXML childElementNamed:@"link" parentElement:node_item];
link = [TBXML textForElement:node_traverse];
[currentEvent setLink:link];
node_traverse = [TBXML childElementNamed:@"pubDate" parentElement:node_item];
date = [TBXML textForElement:node_traverse];
NSRange stringRange = {0,16};
date = [date substringWithRange:stringRange];
[currentEvent setDate:date];
if(![datesArray containsObject:date])
{
[datesArray addObject:date];
}
NSString *eventDate = [currentEvent date];
NSMutableArray *temp = [eventsDict objectForKey:eventDate];
if(!temp)
{
temp = [NSMutableArray array];
[temp addObject:currentEvent];
[eventsDict setObject:temp forKey:eventDate];
} else {
[temp addObject:currentEvent];
}
node_item = node_item -> nextSibling;
[pool drain];
}
}
}
}
这里是我的EventArticleObject.m:
@implementation EventArticleObject
@synthesize link, date, title;
- (id)initWithTitle:(NSString *)title2
date:(NSString *)date2
link:(NSString *)link2;
{
self = [super init];
if(!self)
return nil;
[self setLink:link2];
[self setDate:date2];
[self setTitle:title2];
return self;
}
@end
我建议你从https://github.com/jayway/CWFoundation抛出赞成CWXMLTranslator'的''TBXML' - 这种方式可以用两条语句和一条小三线DSL替换容易出错的XML解析器代码。 – PeyloW 2011-05-12 13:51:51
@PeyolW感谢您的链接!如果我无法弄清楚这一点,我将继续尝试CWXMLTranslator。 – RyanG 2011-05-12 13:59:23
你还可以发布如何在EventArticleObject中设置属性吗?如果属性被覆盖而不是合成,那么发布这些方法。还有你在哪里发布了eventsDict和datesArray? – 2011-05-12 14:16:29