首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iPhone + stringWithUTF8String +内存泄漏

iPhone + stringWithUTF8String +内存泄漏
EN

Stack Overflow用户
提问于 2009-12-23 14:55:18
回答 2查看 5.1K关注 0票数 2

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

代码语言:javascript
复制
objPlayer.playerName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 2)];

当我运行工具来查找内存泄漏时,它会在上面的代码行给出NSCFString泄漏。

我该怎么办,请帮帮我。

致以问候。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-12-23 15:52:21

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

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

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

如果这一切都不合理,看看Alex链接到的内存管理指南。

票数 2
EN

Stack Overflow用户

发布于 2009-12-23 16:03:20

尝试:

代码语言:javascript
复制
NSString *_playerName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 2)];
objPlayer.playerName = _playerName;

或者:

代码语言:javascript
复制
NSString *_playerName = [[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(selectstmt, 2)];
objPlayer.playerName = _playerName;
[_playerName release];

请花点时间通读一下苹果的memory management guide,它解释了这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1951099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档