【问题标题】:iPhone + stringWithUTF8String + memory leaksiPhone + stringWithUTF8String + 内存泄漏
【发布时间】:2009-12-23 06:55:17
【问题描述】:

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

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

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

我该怎么办,请帮帮我。

问候。

【问题讨论】:

  • 你的类中如何定义 playerName 属性?
  • 弗拉基米尔,NSString *playerName; @property (nonatomic, 保留) NSString *playerName;

标签: iphone memory memory-leaks


【解决方案1】:

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

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

你必须在某个时候释放这个字符串,否则你会得到一个泄漏。然而,由于它是一个属性,它不应该在包含它的对象之前被释放,所以你应该在你的 dealloc 方法中放置那个释放语句。

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

【讨论】:

  • Ian,我没听懂你在说什么,请你详细解释一下
【解决方案2】:

试试:

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,它解释了这个主题。

【讨论】:

  • 也许您可以报告 Leaks 所说的在使用上述代码时发生泄漏的位置。这可能会在一定程度上缩小问题范围。
  • 另外,sqlite3_column_text() 返回const unsigned char *,而-initWithUTF8String: 根据developer.apple.com/mac/library/documentation/cocoa/reference/… 接受const char *,所以应该不需要强制转换。
  • 最后,你是在模拟器上运行还是在设备上运行,或者两者都运行?有时模拟器会报告设备上不会发生的内存泄漏,反之亦然。这也是有用的信息。
  • 基本上,您可以在问题中添加的信息越多,人们就越容易帮助您。
猜你喜欢
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
  • 2010-11-23
  • 2011-12-10
  • 2011-05-24
  • 2023-03-20
相关资源
最近更新 更多