为啥我不能在 iOS 中 RemoveAllObjects 的 NSMutableArray?

Posted

技术标签:

【中文标题】为啥我不能在 iOS 中 RemoveAllObjects 的 NSMutableArray?【英文标题】: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,对象就会被删除。只有当它们不再被其他任何东西保留时,它们才会被释放。 【参考方案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 并因此泄漏或者它们可能只是由其他东西拥有。

【讨论】:

以上是关于为啥我不能在 iOS 中 RemoveAllObjects 的 NSMutableArray?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能在 iOS 上离开键盘以在 React Native App 中发送帖子?

为啥推送通知不能在 iOS 中使用 Firebase 从设备到设备?

为啥我不能在 ios 设备上关闭并重新打开 react-native 调试?

为啥我不能在我的 Swift iOS 应用程序中使用 CIFilter 将我的图像反转回原始图像

为啥蓝牙 LE 不能从 iOS 模拟器到我的设备工作?

为啥我不能直接在 iOS 中的任何地图应用程序上进行深度链接以进行轮流导航? [关闭]