Objective c 为什么可以';在iOS中删除NSMutableArray的所有对象吗?

Objective c 为什么可以';在iOS中删除NSMutableArray的所有对象吗?,objective-c,ios,cocoa,Objective C,Ios,Cocoa,我正在开发一个应用程序,使用ARC搜索sqlite数据库 我必须将数据库中的数据检索到NSMutableArray中,以便在UISearchBar的textDidChange事件发生时显示检索到的数据 当UISearchBar的textDidChange更改时,它从数据库中检索了大量数据 从数据库中检索到大量数据后,我总是使用以下代码从NSMutableArray中清除 [self.myArrayData removeAllObjects]; 但是,我从NSMutableArray中删除了所有

我正在开发一个应用程序,使用ARC搜索sqlite数据库

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

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

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

[self.myArrayData removeAllObjects];
但是,我从NSMutableArray中删除了所有数据,内存分配仍在进行。 没有减少

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

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

这里的信息不多,但可能不是NSMUTABLEARY保存数据。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

此处的信息不多,但可能不是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

如果在
之后[self.myArrayData removeAllObjects]
[self.myArrayData count]==0
您可以确保数组已删除其对象并减少其保留计数。。。但是如果其他对象仍然拥有它们,它们实际上就不会被解除锁定。。。因此,这些对象可能被保留了,因此被泄漏,或者它们可能只是属于其他对象。

如果在
[self.myArrayData removeAllObjects]之后
[self.myArrayData count]==0
您可以确保数组已删除其对象并减少其保留计数。。。但是如果其他对象仍然拥有它们,它们实际上就不会被解除锁定。。。因此,这些对象可能被保留了,因此被泄漏了,或者它们可能只是被其他东西拥有。

您需要提供更多的上下文。您如何知道内存与数组关联?我以前用Instrument tool跟踪。在我键入10次之后,它需要100MB内存。我还使用了RemoveAllObject。这并不能回答问题;您怎么知道100MB内存甚至与阵列远程关联?!如果删除AllObject,则会删除这些对象。只有当它们不再被其他任何东西保留时,才会解除分配。您需要提供更多的上下文。您如何知道内存与阵列关联?我以前使用Instrument tool进行跟踪。键入10次后,需要100MB内存。我还使用了RemoveAllObject。这并不能回答问题;您怎么知道100MB内存甚至与阵列远程关联?!如果删除AllObject,则会删除这些对象。只有当它们不再被其他任何东西保留时,才会被解除分配。感谢您的帮助回答。这解决了我的问题。但在我搜索了50次后,您的声明中出现错误。“无法加载数据库。”即。Xcode还显示行中的错误。那是什么错误?我该怎么解决呢?你说我发布的代码只有在你搜索50次后才出现错误?打开数据库时,我的代码只应运行一次。这应该只发生一次,通常是在应用程序启动时。有些人会关闭/重新打开数据库以清除缓存,但由于您将缓存大小设置为0,因此无需执行此操作。您真的不应该为每次搜索关闭/打开数据库。相反,请保持数据库打开。谢谢您的帮助性回答。这解决了我的问题。但在我搜索了50次后,您的声明中出现了错误。“无法加载数据库。”即。Xcode还显示行中的错误。那是什么错误?我该怎么解决呢?你说我发布的代码只有在你搜索50次后才出现错误?打开数据库时,我的代码只应运行一次。这应该只发生一次,通常是在应用程序启动时。有些人会关闭/重新打开数据库以清除缓存,但由于您将缓存大小设置为0,因此无需执行此操作。您真的不应该为每次搜索关闭/打开数据库。相反,只需保持数据库打开即可。