2011-05-12 63 views
1

我正在接收可追溯至以下方法的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 
+0

我建议你从https://github.com/jayway/CWFoundation抛出赞成CWXMLTranslator'的''TBXML' - 这种方式可以用两条语句和一条小三线DSL替换容易出错的XML解析器代码。 – PeyloW 2011-05-12 13:51:51

+0

@PeyolW感谢您的链接!如果我无法弄清楚这一点,我将继续尝试CWXMLTranslator。 – RyanG 2011-05-12 13:59:23

+0

你还可以发布如何在EventArticleObject中设置属性吗?如果属性被覆盖而不是合成,那么发布这些方法。还有你在哪里发布了eventsDict和datesArray? – 2011-05-12 14:16:29

回答

1

验证EventArticleObject类,如果所有的变量被释放正确

1

你在EventArticleObject-dealloc方法释放link