Ios 如何持久化NSMutableArray

Ios 如何持久化NSMutableArray,ios,iphone,objective-c,nsmutablearray,persistent-storage,Ios,Iphone,Objective C,Nsmutablearray,Persistent Storage,我对iOS开发绝对是新手。 我从一个非常有用的教程开始 因此,我按照说明制作了简单的待办事项列表应用程序 应用程序:这是一个简单的待办事项列表。它有一个带有单个文本字段的视图,该视图接收输入,然后将该输入附加到表列表视图。表列表视图是我的“待办事项列表”,它是从NSMutableArray生成的 问题:每当我退出并重新启动应用程序时,我的列表就会消失 问题:我需要一种方法将存储我的列表的NSMutableArray*持久化为polist 那么,是否有可能保留该列表?还是我必须使用某种数据存储?

我对iOS开发绝对是新手。 我从一个非常有用的教程开始

因此,我按照说明制作了简单的待办事项列表应用程序

应用程序:这是一个简单的待办事项列表。它有一个带有单个文本字段的视图,该视图接收输入,然后将该输入附加到表列表视图。表列表视图是我的“待办事项列表”,它是从NSMutableArray生成的

问题:每当我退出并重新启动应用程序时,我的列表就会消失

问题:我需要一种方法将存储我的列表的
NSMutableArray*持久化为polist

那么,是否有可能保留该列表?还是我必须使用某种数据存储? 在询问和阅读有关将列表存储在“NSUserDefaults”中的内容之前,我做了一些研究,但问题是,NSUserDefaults只返回一个im可变对象

结论:

  • 我们可以保存NsMutable列表吗?如果是,怎么做

  • 是否需要使用NSUserDefaults?为什么?

  • 如果(2)是yes,那么如何使返回的NsUserDefaults的immutable对象可变

  • 我应该再次告诉你,我仅有的iOS开发经验来自教程。所以如果你能把它分解成最简单的形式,我会很高兴的

    谢谢。

    1)如果您只想保存一个
    NSMutableArray
    ,那么可以使用
    NSUserDefaults

    2) 如果您不想处理核心数据并设置适当的数据结构,那么这似乎是唯一的选择


    3) 当您从
    NSArray*数组中获取
    NSMutableArray
    时,只需使用
    [array mutableCopy]

    就可以获得CoreData。它真的很容易实现和使用

    以下是开始的步骤

    这是你的电话号码

    这是

    尽管有其他观点,我还是建议您只使用核心数据。使用XCode提供的可视化界面似乎太容易了&大量的开发支持


    我反对使用NSUserDefaults,因为待办事项列表应该在应用程序中展开&您可能希望对这些对象执行多个操作。每次从userDefaults获取数据对我来说都不是一个好方法

    为什么使用NSUserDefaults:

    NSUserDefaults类为与默认系统交互提供编程接口。默认系统允许应用程序自定义其行为以匹配用户的首选项。例如,您可以允许用户确定应用程序显示的度量单位或自动保存文档的频率。应用程序通过将值分配给用户的默认数据库中的一组参数来记录这些首选项。这些参数被称为默认值,因为它们通常用于确定应用程序启动时的默认状态或默认操作方式


    以下是您最好使用
    核心数据
    ,或其他一些持久化方法,如
    FMDB
    。使用
    NSUserDefaults
    是可以的,但是
    NSUserDefaults
    的性能非常差。您可以使用
    NSUserDefaults
    进行演示,但对于最终的应用程序,强烈建议使用更好的方法。

    简单的答案是使用NSArray的writeToURL:Atomicaly:和arrayWithContentsOfURL:方法将阵列写入磁盘上的文件并从中读取阵列。一个较长的答案可以证明这可能是正确的…现在我将跳到答案:“指向“~/Library/Application Support/”文件夹中(您的应用程序特有)文件夹中的文件。(注意:我是OSX程序员…可能有更好的位置放置iOS应用程序…;-)以下代码:

    NSArray * array;    // <<== this is your array (I assume you've created it somewhere…)
    
    // get the document directory URL
    NSURL *documentsDirectoryURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentsDirectory inDomains:NSUserDomainMask] firstObject];
    
    
    // append our file name
    NSURL *url = [documentDirectoryURL URLByAppendingPathComponent:@"ToDo.data" isDirectory:NO];
    
    #if WRITING_ARRAY
        // write our array to the file
        if (![array writeToURL:url atomically:YES]) {
            NSLog(@"Failed to writeToURL:'%@'", url);
        }
    #else // READING_ARRAY
        // read (mutable) array from file
        array = [[NSArray arrayWithContentsOfURL:url] mutableCopy];
    #endif
    

    NSArray*数组;//
    NSMutableArray*数组=[[[NSUserDefaults standardUserDefaults]objectForKey:@“key”]mutableCopy]
    我反对使用NSUserDefaults,因为待办事项列表应该在你的应用程序中扩展,&你可能想在这些对象上执行一些操作。每次从userDefaults获取数据对我来说都不是一个好方法。核心数据。现在就学习它-以后你会感谢它。这正是我所想的。待办事项列表将扩展,并且每次保存和检索它似乎都是一个不完整的概念。我想知道的另一个观点是,NSUserDefaults到底是用来做什么的?如果你想保留一些基于用户的设置,应该使用NSUserDefaults,因为这些设置更改的频率较低&这也不应该太大。@Leo我在回答中添加了更多关于NSUserDefaults的信息。Feel自由接受/投票回答,如果您同意这些观点。如果需要更多信息,请告诉我。干杯:)另一个优势-核心数据允许您存储自定义对象,而您只能在NSUserDefaults或磁盘上存储plist-able对象。我已将其编辑为更适合iOS应用程序。我使用上述代码存储NSMutableArray,当我尝试从.data文件检索数据时,我得到了nil.Kunal Shrivastava:检查您的控制台,查看writeToURL是否发布了任何失败消息。只需在writeToURL之后立即双击arrayWithContentsOfURL,并将读取的内容与写入的内容进行比较。显然,它们应该是相同的;如果它们是n再次检查控制台是否有错误消息。这不是唯一的选项,您可以将数组写入plist,只要数组只包含plist-able对象。或者,您可以使自定义对象符合NSCoding,并使用
    archiveDataWithRootObject:
    将数组保存到磁盘上的文件中。