1

我使用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];

在此处输入图像描述

在此处输入图像描述

4

3 回答 3

1

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

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

我只是想提出一种不同的方法来摆脱自动释放的返回对象类工厂方法中自动释放的返回对象,例如[NSFoo fooWith...]

相反,如果您使用该模式

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

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

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

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

于 2013-09-26T07:57:59.613 回答
0

我遇到了完全相同的问题。原来是因为 stringWithUTF8String 在内部使用了自动释放,所以直到封闭的自动释放池块(在我的例子中是整个应用程序)结束时才释放内存。

作为一个实验,试试这个:

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

你应该会看到活动字节停止增长。

于 2013-09-26T07:06:08.597 回答
0

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

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

label.text = [NSString stringWithFormat:@"%@",example];
于 2013-05-07T14:49:23.397 回答