【问题标题】:Memory leak in String Formatter字符串格式化程序中的内存泄漏
【发布时间】:2015-08-28 08:44:26
【问题描述】:

我正在使用带有 ARC 的 Objective C。我有以下 sn-p 代码,由于字符串格式化程序,它似乎泄漏了内存。

我将stringWithFormat便捷方法更改为更通用的alloc init,但它仍然在这一行泄漏内存。

我读到 here 我应该使用 copy 关键字,但它仍然在这一行中泄漏内存。

现在,当我完全删除格式化程序时,此行中的代码不会泄漏内存。

  1. 为什么这条线会导致内存泄漏?
  2. 如何解决此内存泄漏问题?

附加信息:

  • 代码编写于:Xcode 6.3.1
  • 使用 Xcode 6.3.1 中的 Instruments 可视化内存泄漏
  • iOS 部署目标:iOS 5.0

代码库:

#define DATABASE_NAME           @"orderwriter"

+ (SQLiteManager *) getSQLiteManager
{
    // NSInteger userId = [(NSString *)[AppUtil NSDefaultforKey:USER_ID] integerValue];
    // NSString *dbName = [NSString stringWithFormat:@"%@_%ld.db", DATABASE_NAME, (long)userId];
    NSString *dbName = @"orderwriter_58.db";
    SQLiteManager *dbManager = [[SQLiteManager alloc] initWithDatabaseNamed:dbName];
    return dbManager;
}

SQLiteManager 的班级,我在 Github 上找到的。

【问题讨论】:

  • 只有代码的图像会使尝试代码容易出错。示例代码未提供DATABASE_NAME,因此无法再次测试代码。
  • Xcode 6.3.1 不提供部署目标 iOS 5 那么如何选择呢?
  • 项目设置对所有未覆盖设置的目标有效。

标签: ios objective-c memory-leaks string-formatting instruments


【解决方案1】:

stringWithFormat 方法返回一个自动释放的对象。在释放池耗尽之前,它不会被释放。您是否有机会在后台线程中运行?如果是这样,您可能需要在线程代码的开头创建一个自动释放池,并在完成后将其清空。

如果不是,那么我不确定您为什么会泄漏。 ARC 应该正确处理该字符串的所有权。它可能是编译器错误。你用的是什么版本的 Xcode?​​p>

如果不是自动释放池问题,那么您可能应该向 Apple 提交雷达错误。

【讨论】:

  • 也许吧。对于@physicalattraction, DATABASE_NAME 是 #defined 常量还是宏?发布定义。
  • 我没有在后台线程中运行这段代码。我已经添加了DATABASE_NAME 的定义和文本格式的相关代码。
猜你喜欢
  • 2011-06-12
  • 2014-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-29
  • 2013-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多