目标C ARC无法释放内存

时间:2014-08-14 10:35:38

标签: ios objective-c memory-leaks

根据泄漏工具,以下代码会导致内存泄漏:

- (NSString *)emojiWithCode:(int)code {
    int sym = EMOJI_CODE_TO_SYMBOL(code);
    __block __weak NSString *result = [[NSString alloc] initWithBytes:&sym length:sizeof(sym) encoding:NSUTF8StringEncoding];
    return result;
}

我试图用免费(& sym)释放sym但当时出现以下错误:

malloc: *** error for object 0x27d2e60c: pointer being freed was not allocated *** set a breakpoint in malloc_error_break to debug

如果未分配,这会导致泄漏?
如何正确释放此内存并解决问题?
EMOJI_CODE_TO_SYMBOL就是这个

#define EMOJI_CODE_TO_SYMBOL(x) ((((0x808080F0 | (x & 0x3F000) >> 4) | (x & 0xFC0) << 10) | (x & 0x1C0000) << 18) | (x & 0x3F) << 24);


我也附上了泄漏工具截图。

enter image description here



enter image description here

1 个答案:

答案 0 :(得分:1)

仪器无法知道此对象泄露的原因,因此它只显示泄漏对象最初分配的代码行。这行代码(一旦删除__block__weak)就可以了,所以你必须深入研究这个对象泄露的原因。

总而言之,您不必对此行代码执行任何操作,而是需要确定此字符串随后的使用位置,以便确定泄漏的原因。最有可能的是,使用此字符串本身的对象泄漏(例如,强引用循环或类似于保留泄漏对象的重复计时器)。而且由于该对象泄露,这个字符串也泄露了。因此,将您的分析提升到一个水平,并查看该字符串的使用位置,并找出它未被释放的原因。

我建议您查看WWDC 2012视频iOS App Performance: Memory,获取有关如何使用仪器指导您的研究以确定泄漏的最终来源的教程。

此外,通常值得进行静态分析(在Xcode“产品”菜单上选择“分析”),因为在某些情况下它可以识别问题的根源。在潜入仪器之前,确保静态分析仪为您提供干净的健康状况。这在非ARC代码中更为有用,但有时它可以识别问题。