ARC,stringWithUTF8String内存稳步增长“Live Bytes”

时间:2013-01-20 10:01:02

标签: ios memory automatic-ref-counting memory-leaks

我正在使用 ARC ,每次调用以下代码时。我发现“Live Bytes”每次都会增加一点。这里必须有内存泄漏。

char* example = (char *)sqlite3_column_text(compiledStatement, 1);                                

label.text = [NSString stringWithUTF8String:example];

但是如果我这样做,内存将永远保持在一个字节数上。但label.text内容不是我想要的确切单词,它就像“&#(&(* @#)#@ $”一样腐败。

char* example = (char *)sqlite3_column_text(compiledStatement, 1);                                

label.text = [NSString stringWithFormat:@"%s",example];

enter image description here

enter image description here

3 个答案:

答案 0 :(得分:1)

老问题,但仍然是实际的:

@jlegakis已经指出,这可能是一个“自动释放问题”。

我只是想提出一种不同的方法来从{em>类工厂方法中删除自动释放的返回对象,如[NSFoo fooWith...]

相反,如果你使用模式

NSFoo* foo = [[NSFoo alloc] initWith...]

创建的对象未自动释放。所以,如果你写:

char* example = (char *)sqlite3_column_text(compiledStatement, 1);
label.text = [[NSString alloc] initWithUTF8String:example];

“自动释放问题”应该消失。

答案 1 :(得分:0)

尝试以这种方式读取字符串,看看是否发生了任何变化。

char* example = (char *)sqlite3_column_text(compiledStatement, 1);                                

label.text = [NSString stringWithFormat:@"%@",example];

答案 2 :(得分:0)

我遇到了完全相同的问题。事实证明是因为stringWithUTF8String在内部使用自动释放,所以直到封闭的自动释放池块结束时才释放内存(在我的情况下是整个应用程序)。

作为实验,试试这个:

@autoreleasepool {
  char* example = (char *)sqlite3_column_text(compiledStatement, 1);                                
  label.text = [NSString stringWithUTF8String:example];
}

你应该看到实时字节停止增长。