为啥我不能在 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 调试?