代码之家  ›  专栏  ›  技术社区  ›  Nava Carmon

iPhone自动释放字符串的内存泄漏

  •  1
  • Nava Carmon  · 技术社区  · 16 年前

    我正在尝试用泄漏仪器清除我的应用程序中的漏洞。 它向我展示了XML解析器(tbxml)上的漏洞。

    下面是我将在解析时创建的类:

    @interface GraphPoint : NSObject {
        NSString* x;
        NSString* y;
    }
    
    
    @property (nonatomic, copy) NSString* x;
    @property (nonatomic, copy) NSString* y;
    
    @end
    
    @implementation GraphPoint
    
    @synthesize x, y;
    
    ... some calculations
    
    - (void) dealloc
    {
        [x release];
        [y release];
        [super dealloc];
    }
    
    @end
    

    在解析器中:

    … //根据元素找到时:

            NSString    *str;
            GraphPoint  *aPoint = [[GraphPoint alloc] init];
    
            TBXMLElement *item = [TBXML childElementNamed:kX_Item parentElement:pntItem];
            str = [TBXML textForElement:item];  
            aPoint.x = [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];     
    
            item = [TBXML childElementNamed:kY_Item parentElement:pntItem];
            str = [TBXML textForElement:item];  
            aPoint.y = [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    
    
            [points addObject:aPoint];
            [aPoint release];
    

    Leaks Instrument在tbxml的textferement函数中显示泄漏,该函数提供自动释放的字符串:

    + (NSString*) textForElement:(TBXMLElement*)aXMLElement {
        if (nil == aXMLElement->text) return @"";
        return [NSString stringWithCString:&aXMLElement->text[0] encoding:NSUTF8StringEncoding];
    }
    

    由于我们有时谈论数百甚至数千个点,这些泄漏会变得很大。我不明白为什么自动释放的字符串会产生泄漏?

    有什么想法吗?

    谢谢

    1 回复  |  直到 16 年前
        1
  •  0
  •   Nikolai Ruhe    16 年前

    已发布代码中没有保留/释放问题。唯一的分配 textForElement: 是NSString的 stringWithCString:encoding: 我怀疑会泄露。

    这个问题在其他地方,不能用给定的信息来回答。您确定正在正确读取仪器结果吗?静态分析对代码说了什么?

    我不知道tbxml库,但是包含 nil == aXMLElement->text 让它看起来有点可疑。这不是错误,而是风格问题: aXMLElement->text 似乎是C字符串 nil 用于objc对象。