【问题标题】:xcode project - memory leaksxcode 项目 - 内存泄漏
【发布时间】:2011-03-01 14:47:21
【问题描述】:

我正在尝试消除我的项目中的内存泄漏,但我现在被困在两种情况下好几天了。

- (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 * item 被重复用于每个元素。

有什么建议吗?提前谢谢你:)

【问题讨论】:

    标签: objective-c xcode memory-leaks


    【解决方案1】:

    您似乎知道,一般规则是对于每个copyretainallocnew,还必须有一个release。我认为您可以致电[[item copy] autorelease] 并删除您之前的检查。

    如果这不能解决任何问题,请尝试检查 item != nil,而不是 if(item)

    另外,考虑使用其他两个工具,“构建”菜单中的“构建和分析”,以及“NSZombie”来查找其他内存泄漏。此外,使用 Leaks Instumeny 查看导致泄漏的库。它可能是 Apple 的,也可能是您自己的。如果是您的,Leaks 将帮助您识别它。否则,这不是你的问题。

    【讨论】:

    • 首先感谢您的回复。我已经尝试过自动释放该项目,但仍然泄漏。使用 Build And Analyze 显示一切正常...
    • 我认为你的支票坏了。尝试检查item != nil,而不是if(item)
    • 你可能没有直接给我解决方案,但你强迫我使用 NSZombie。那给我指明了方向!谢谢:)
    • Cris - 更正 - 我没有强迫你做任何事。我建议。 :p 我很高兴能帮上忙。
    • 已经做到了!再次感谢 ;) (P.S.“强制”来自希腊语的错误翻译,尽管翻译成英文:P)