可可;这段代码有什么漏洞?

时间:2010-12-13 03:55:34

标签: cocoa

NSMutableArray *tempData=[[NSMutableArray alloc]init];  
    TBXMLElement * city = [TBXML childElementNamed:@"city" parentElement:root];
    while(city!=nil){
        if([TBXML valueOfAttributeNamed:@"name" forElement:city]!=nil){
        NSString *tempDataHolder=[NSString stringWithFormat :@"%@,%@",[TBXML valueOfAttributeNamed:@"name" forElement:city],[TBXML valueOfAttributeNamed:@"country_name" forElement:city]]; 
        [tempData addObject:[tempDataHolder copy]];         
        [tempDataHolder release];
               }
city = [TBXML nextSiblingNamed:@"city" searchFromElement:city];         

    }
    tableData=[tempData copy];
    [tableCities reloadData];
    [tempData release];

内存泄漏的仪器表示存在多个NSCFS字符串的泄漏,我一直在试图解决它,任何帮助都非常感谢。

由于

编辑:上面的一组代码运行了几次,我有一堆漏洞引用了NSCFString - NSPlaceholderString。我几乎立即释放tempDataHolder,其余的变量也被释放。我无法确定泄漏的位置。

1 个答案:

答案 0 :(得分:4)

所有者需要释放复制的对象。也就是说,copy方法返回一个保留计数为1的新对象。在您的情况下,罪魁祸首似乎是这一行:

[tempData addObject:[tempDataHolder copy]];

容器保留其元素,但复制的对象在插入数组之前已经具有保留计数1。因此复制的对象泄漏。

只需在数组中添加tempDataHolder(不是副本)就可以解决它。

此外,tempDataHolder是一个自动释放的对象,不应该显式释放。