我在应用程序中使用以下代码从数据库中读取字符串值:
objPlayer.playerName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 2)];当我运行工具来查找内存泄漏时,它会在上面的代码行给出NSCFString泄漏。
我该怎么办,请帮帮我。
致以问候。
发布于 2009-12-23 15:52:21
当您设置属性playerName时,它会自动保留NSString (即使它的构造函数自动释放它)。因此,您必须在某个时刻再次释放它(最好是在dealloc方法中)。
当您为使用retain标志声明的属性赋值时(如在@property(retain)中),无论何时为该属性赋值,它都会执行三项操作:释放旧值,将变量赋值给新值,并保留新值。因此,在执行该行之后,通过stringWithUtf8String:创建的字符串的保留计数为1。
您必须在某个时候释放此字符串,否则会泄漏。但是,因为它是一个属性,所以不应该在包含它的对象之前释放它,所以应该将release语句放在dealloc方法中。
如果这一切都不合理,看看Alex链接到的内存管理指南。
发布于 2009-12-23 16:03:20
尝试:
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];请花点时间通读一下苹果的memory management guide,它解释了这个问题。
https://stackoverflow.com/questions/1951099
复制相似问题