【问题标题】:NSMutableArray with 500 objects.NSMutableArray 包含 500 个对象。
【发布时间】:2011-08-05 00:36:15
【问题描述】:

我有一个包含 500 个对象的数组,每个对象都是必需的,因为每个对象都代表我的程序的另一个问题。我的程序似乎在 iPhone 4 上占用了大约 50 mb 左右的相当多的内存。我看到当数组在使用时,它似乎有点滞后于程序。这种大小的数组在使用时会导致延迟吗?有人可以估计这个数组使用了多少内存吗?

我在想也许将数组保存到 plist 文件并从那里使用数组,这样会节省内存吗?

谢谢, 雅各布

【问题讨论】:

  • 您的数组本身不会使用那么多内存——其中的对象可能会。真正的问题是,你的每个对象有多大,如果它们这么大,你为什么要把它们保存在内存中?

标签: objective-c ios arrays nsmutablearray


【解决方案1】:

假设一个问题包含以下内容

    typedef struct
    {
       char _question[255];
       char _answerA[255];
       char _answerB[255];
       char _answerC[255];
       char _answerD[255];

       int _correctAnswer;

} question;

按问题顺序将 500 个这些结构保存到文件中。

在此示例中,所有 500 个问题大约占用 0.609874725 mbs。

然后打开一个文件并寻找问题

    Handle fOpen... 
        fSeek...  questionNumber *sizeof(question) ;
        read in one question fRead...
    fClose(Handle)

【讨论】:

    【解决方案2】:

    首先,我们无法告诉您数组占用了多少内存,因为它取决于所存储的对象。但是,您可以使用 Instruments 工具(Build -> Profile)来查看这些内容。

    其次,对于 500 个对象,我会认真考虑将 SQLite 或 CoreData 用于您的存储。您不太可能同时需要内存中的所有 500 个问题 - 毕竟,一两个可能应该这样做,一次可以回答多少个问题?

    【讨论】:

    • 那么对于核心数据,它会一次加载一个吗?这才是真正要做的。
    • 你当然可以使用 NSFetchRequest 使用 CoreData 来做到这一点。
    • 没问题。祝您使用该应用程序好运。
    【解决方案3】:

    首先,除非您告诉对象存储的大小,否则绝对不可能给出估计值。 但无论如何,将所有内容加载到内存中并不是一个好主意。您可以在简单的 plist 文件中以小块的形式(比如每个 10 个问题)存储问题。 至于我,我更喜欢将此类信息存储在数据库中(CoreData 管理内存非常好)。

    【讨论】:

      【解决方案4】:

      我无法帮助解决内存问题,但我突然想到,也许不同的加载策略可能是答案。例如,我假设用户不会一口气阅读或回答所有 500 个问题。那么是否可以根据用户需要将它们加载到块中?或者如果您的问题之间存在依赖关系,您是否只能加载当前相关的问题?还将它们存储在 Core Data 数据库中,这样您就可以查询显示所需的那些也可能会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-20
        • 2013-11-08
        • 1970-01-01
        • 1970-01-01
        • 2011-02-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多