根据泄漏工具,以下代码会导致内存泄漏:
- (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);
我也附上了泄漏工具截图。
答案 0 :(得分:1)
仪器无法知道此对象泄露的原因,因此它只显示泄漏对象最初分配的代码行。这行代码(一旦删除__block
和__weak
)就可以了,所以你必须深入研究这个对象泄露的原因。
总而言之,您不必对此行代码执行任何操作,而是需要确定此字符串随后的使用位置,以便确定泄漏的原因。最有可能的是,使用此字符串本身的对象泄漏(例如,强引用循环或类似于保留泄漏对象的重复计时器)。而且由于该对象泄露,这个字符串也泄露了。因此,将您的分析提升到一个水平,并查看该字符串的使用位置,并找出它未被释放的原因。
我建议您查看WWDC 2012视频iOS App Performance: Memory,获取有关如何使用仪器指导您的研究以确定泄漏的最终来源的教程。
此外,通常值得进行静态分析(在Xcode“产品”菜单上选择“分析”),因为在某些情况下它可以识别问题的根源。在潜入仪器之前,确保静态分析仪为您提供干净的健康状况。这在非ARC代码中更为有用,但有时它可以识别问题。