Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone+;stringWithUTF8String+;内存泄漏_Iphone_Memory_Memory Leaks - Fatal编程技术网

iPhone+;stringWithUTF8String+;内存泄漏

iPhone+;stringWithUTF8String+;内存泄漏,iphone,memory,memory-leaks,Iphone,Memory,Memory Leaks,我在应用程序中使用以下代码从数据库中读取字符串值: objPlayer.playerName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 2)]; 当我运行仪器来查找内存泄漏时,它会给我NSCFString上一行的泄漏 我该怎么办,请帮帮我 关于。当您设置属性playerName时,它会自动保留NSString(即使其构造函数自动将其删除)。因此,您必须在某个时候再次释放它(最好使用deall

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

objPlayer.playerName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 2)];
当我运行仪器来查找内存泄漏时,它会给我NSCFString上一行的泄漏

我该怎么办,请帮帮我


关于。

当您设置属性
playerName
时,它会自动保留
NSString
(即使其构造函数自动将其删除)。因此,您必须在某个时候再次释放它(最好使用
dealloc
方法)

当您向使用retain标志声明的属性赋值时,如在
@property(retain)
中所述,那么每当您向该属性赋值时,它都会执行三件事:释放旧值、将变量赋值给新值以及保留新值。因此,您通过
stringWithUtf8String:
创建的字符串在执行该行后保留计数为1

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

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

试试:

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


请花一点时间阅读苹果的,它解释了这个主题。

在您的类中如何定义playerName属性?Vladimir,NSString*playerName@属性(非原子,保留)NSString*playerName;伊恩,我不明白你在说什么,你能详细解释一下吗?也许你可以报告泄漏的地方,说泄漏是在使用上述代码时发生的。这可能会在某种程度上缩小问题的范围。此外,
sqlite3\u column\u text()
返回
const unsigned char*
,并且
-initWithUTF8String:
根据使用
const char*
,因此不需要强制转换。最后,您是在模拟器上运行还是在设备上运行,或者两者都运行?有时模拟器会报告设备上不会发生的内存泄漏,反之亦然。这也是有用的信息。基本上,你能在问题中添加的信息越多,人们就越容易帮助你。
NSString *_playerName = [[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(selectstmt, 2)];
objPlayer.playerName = _playerName;
[_playerName release];