【问题标题】:Why can't i RemoveAllObjects of NSMutableArray in iOS?为什么我不能在 iOS 中 RemoveAllObjects 的 NSMutableArray?
【发布时间】:2012-04-25 16:39:50
【问题描述】:

我正在使用 ARC 开发一个使用 sqlite 数据库进行搜索的应用。

当 UISearchBar 的 textDidChange 事件发生时,我必须将数据从数据库中检索到 NSMutableArray 中以显示检索到的数据。

当 UISearchBar 的 textDidChange 时,它​​有大量的数据从数据库中检索出来。

从数据库中检索到大量数据后,我总是使用以下代码从 NSMutableArray 中清除。

[self.myArrayData removeAllObjects];

但是我从 NSMutableArray 中删除了所有数据,内存分配仍在发生。 没有减少。

下次我在 UISearchBar 中输入内容时,内存分配仍在增加。 在我输入 10 次或以上后,我收到 XCodes 的内存警告和内存不足。

我想知道为什么当我调用 removeAllObjects 方法时来自 NSMutableArray 的数据不清楚。 我正在使用 ARC 开发我的应用程序。 请帮帮我。

【问题讨论】:

  • 您需要提供更多上下文。
  • 怎么知道内存与数组关联?
  • 我以前是用Instrument工具跟踪的,打了10次后,占用了100MB内存。我也用过RemoveAllObject。
  • 这不能回答问题; 你怎么知道 100MB 内存甚至与数组远程关联?! 如果你 removeAllObjects,对象就会被删除。只有当它们不再被其他任何东西保留时,它们才会被释放。

标签: objective-c ios cocoa


【解决方案1】:

您在这里没有很多信息,但可能不是 NSMutableArray 持有数据。 SQLite 还保留最近检索记录的缓存。您可以在打开数据库后通过执行此操作来减少/删除 SQLCache。将缓存大小设置为您希望 SQLite 缓存的页数。默认值为 2000。每页大小为 1024 字节。

    const char *pragmaSql = "PRAGMA cache_size = 0";
    if (sqlite3_exec(database, pragmaSql, NULL, NULL, NULL) != SQLITE_OK) {
        NSAssert1(0, @"Error: failed to execute pragma statement with message '%s'.", sqlite3_errmsg(database));
    }

编辑:从技术上讲,您不能将缓存减少到 10 以下。如果您尝试,程序会将缓存设置为 10。

【讨论】:

  • 感谢您的帮助。这解决了我的问题。
  • 但是我搜索了50次后,你的语句出现了错误。 “无法加载数据库。”那是。 XCodes 还会在您的行中显示错误。那是什么错误?我该如何解决?
  • 你说我贴的代码你搜索了50次才出现错误?我的代码应该只在您打开数据库时运行一次。这应该只发生一次,通常是在应用程序启动时。有些人会关闭/重新打开数据库以清除缓存,但由于您将 cache_size 设置为 0,因此您不需要这样做。您真的不应该为每次搜索关闭/打开数据库。相反,只需保持数据库打开即可。
【解决方案2】:

如果在 [self.myArrayData removeAllObjects]; [self.myArrayData count] == 0 之后,您可以确定您的数组已经删除了它的对象并减少了它们的保留计数......但如果其他对象仍然拥有它们,它们实际上不会是 dealloc'ed...所以这些对象可能超过-retained 并因此泄漏或者它们可能只是由其他东西拥有。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 2013-03-23
    相关资源
    最近更新 更多