malloc:对象的错误:双重免费

时间:2014-01-04 00:48:13

标签: ios malloc nsxmlparser nsmutablestring

我一直在尝试调试此错误,但我找不到问题。根据我的研究,我认为这告诉我,我正在尝试释放一个已经真正缓解的对象,尽管我不确定。我有一个对象作为NSXMLParser对象的委托,我有一个类型NSMutableString的属性,我用它来保存每个元素的字符。这是我的代码:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    self.stringBuffer = [NSMutableString string];

    if ([elementName isEqualToString:@"item"])
        self.parsingPodcast = YES;


    if (attributeDict)
        self.currentAttributesDict = attributeDict;
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    if (string) [self.stringBuffer appendString:string];
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    if (self.parsingPodcast)
    {
        if ([elementName isEqualToString:@"title"])
        {
            self.currentPodcastObject.title = self.stringBuffer;
        }
        else if ([elementName isEqualToString:@"pubDate"])
        {
            self.currentPodcastObject.publishDate = self.stringBuffer;
        }
        else if ([elementName isEqualToString:@"summary"])
        {
            self.currentPodcastObject.summary = self.stringBuffer;
        }
        else if ([elementName isEqualToString:@"imageurl"])
        {
            self.currentPodcastObject.imgURL = self.stringBuffer;
        }
        else if ([elementName isEqualToString:@"enclosure"])
        {
            self.currentPodcastObject.audioURL = [self.currentAttributesDict objectForKey:@"url"];
            self.currentPodcastObject.audioType = [self.currentAttributesDict objectForKey:@"type"];
        }
        else if ([elementName isEqualToString:@"itunes:duration"])
        {
            self.currentPodcastObject.duration = self.stringBuffer;
        }
        else if ([elementName isEqualToString:@"item"])
        {
            parserCompletionBlock(self.currentPodcastObject);
        }
    }
}

我在计划中启用了僵尸,并使用僵尸工具尝试找到任何过度释放的对象,但我找不到任何东西。这是控制台上的输出

:malloc: *** error for object 0x10e7531f0: double free
*** set a breakpoint in malloc_error_break to debug

我添加了malloc_error_break断点

断点在self.stringBuffer属性的setter方法上停止。谁能帮我吗?我肯定错过了什么。在此先感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

[NSMutableString string]是自动释放。在self.stringBuffer上分配它时你应该保留。

self.stringBuffer = [NSMutableString string] retain]

答案 1 :(得分:0)

我实际上遇到了这个错误,因为手机中的内存几乎已满。一旦我清除了手机中的某些应用程序,错误便消失了。不确定这是否有用,但它确实对我有所帮助。