0

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

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

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

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

[self.myArrayData removeAllObjects];

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

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

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

4

2 回答 2

4

您在这里没有很多信息,但它可能不是 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。

于 2012-04-25T16:46:28.243 回答
1

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

于 2012-04-25T22:51:56.117 回答