仪器报告内存泄漏。不明白为啥

Posted

技术标签:

【中文标题】仪器报告内存泄漏。不明白为啥【英文标题】:Memory leak reported by instrument. Can't understand why仪器报告内存泄漏。不明白为什么 【发布时间】:2015-03-29 06:54:59 【问题描述】:

Instruments 告诉我们,以下方法在创建可变字符串时会泄漏内存。谁能告诉我为什么?我在 ios 8 XCode 6.2 上使用 ARC。

 - (NSString *)capitalizeFirstLetter 
        if (self.length == 0) 
            return self;
        
        NSMutableString * string = [NSMutableString stringWithString:self.lowercaseString];
        [string replaceCharactersInRange:NSMakeRange(0, 1) withString:[self substringToIndex:1].capitalizedString];
        return string;
    

【问题讨论】:

请考虑使用-[NSString rangeOfComposedCharacterSequenceAtIndex:],因为并非所有字母都编码为一个字符。 【参考方案1】:

我不确定导致泄漏的原因,但如果您只想避免泄漏,您可以将方法更改为:

- (NSString *)capitalizeFirstLetter 
    if (self.length == 0) 
        return self;
    
    return [NSString stringWithFormat:@"%@%@", [self substringToIndex:1].capitalizedString, [self substringFromIndex:1]];

你也可以在这里查看答案Need help fixing memory leak - NSMutableString

【讨论】:

我将实现更改为您建议的实现,并且 Instruments Stills 报告内存泄漏。会不会是 Instruments 报告了已泄漏对象的创建位置,而不是实际泄漏的代码?真的很难追踪原因。 你可以试试这个:不要调用这个函数,看看是否还有东西泄漏。 我无法重现内存泄漏!你能发布这个方法的调用吗?

以上是关于仪器报告内存泄漏。不明白为啥的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Instruments 将此报告为内存泄漏?

为啥.NET 没有内存泄漏?

Xcode 6 内存泄漏仪器不起作用

重新仪器“内存泄漏”分析,其他工具是不是提供更多信息以找到泄漏的根本原因?

分析仪结果与仪器泄漏:iPhone 内存泄漏

仪器中存在内存泄漏的类