我在我的应用程序中使用以下代码来读取数据库中的字符串值:
objPlayer.playerName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 2)];
当我运行Instruments来查找内存泄漏时,它会在上面的行中给出NSCFString泄漏。
我该怎么办,请帮助我。
问候。
答案 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,其中解释了这个主题。