iPhone + stringWithUTF8String +内存泄漏

时间:2009-12-23 06:55:18

标签: iphone memory memory-leaks

我在我的应用程序中使用以下代码来读取数据库中的字符串值:

objPlayer.playerName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 2)];

当我运行Instruments来查找内存泄漏时,它会在上面的行中给出NSCFString泄漏。

我该怎么办,请帮助我。

问候。

2 个答案:

答案 0 :(得分:2)

当你设置属性playerName时,它会自动保留NSString(即使它的构造函数自动释放它)。所以你必须在某个时候再次发布它(最好是在dealloc方法中)。

当您为使用retain标志声明的属性赋值时,如@property(retain)所示,那么无论何时为该属性赋值,它都会执行以下三项操作:释放旧值,将变量赋给新值值,并保留新值。因此,通过stringWithUtf8String:创建的字符串在执行该行后的保留计数为1。

你必须在某个时候释放这个字符串,否则你会泄漏。但是,由于它是属性,因此不应在包含它的对象之前释放它,因此您应该将该释放语句放在dealloc方法中。

如果这些都没有意义,请查看Alex链接到的内存管理指南。

答案 1 :(得分:0)

尝试:

NSString *_playerName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 2)];
objPlayer.playerName = _playerName;

或者:

NSString *_playerName = [[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(selectstmt, 2)];
objPlayer.playerName = _playerName;
[_playerName release];

请花点时间阅读Apple的memory management guide,其中解释了这个主题。