【问题标题】:What is the best way to store an array of objects with cocoa?用可可存储对象数组的最佳方法是什么?
【发布时间】:2011-09-05 18:32:56
【问题描述】:

我有一个 NSMutableArray,里面有很多对象。有些是 NSStrings,有些是 NSMutableArrays,有些是 NSNumbers。存储这些数据以便应用再次使用它的最佳方式是什么?

数组也需要保持有序。

我在考虑一个 plist 或 NSUserDefaults?

非常感谢

【问题讨论】:

    标签: cocoa-touch xcode cocoa nsmutablearray


    【解决方案1】:

    考虑使用NSKeyedArchiver

    // Archive
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:theArray];
    NSString *path = @"/Users/Anne/Desktop/archive.dat";
    [data writeToFile:path options:NSDataWritingAtomic error:nil];
    
    // Unarchive
    NSString *path = @"/Users/Anne/Desktop/archive.dat";
    NSMutableArray *theArray = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
    

    效果很好,尤其是在数组包含更多字符串和数字的情况下。
    这样您就可以确保未归档的数组与原始数组相同。

    【讨论】:

      【解决方案2】:

      假设其他数组也只包含数字、字符串和数组(或其他属性列表类型),plist 将是存储数据的好方法。它会保持秩序,并且使用简单。

      要将数组写入 plist 文件,请使用 writeToFile:atomically:

      [myArray writeToFile:@"path/to/file.plist" atomically:YES];
      

      要阅读它,请使用initWithContentsOfFile:

      myArray = [[NSMutableArray alloc] initWithContentsOfFile:@"path/to/file.plist"];
      

      但是,这将创建一个内容不可变的可变数组。要创建内容可变的数组,可以使用CFPropertyListCreateDeepCopy

      NSArray *temp = [[NSArray alloc] initWithContentsOfFile:@"path/to/file.plist"];
      myArray = (NSMutableArray*) CFPropertyListCreateDeepCopy(kCFAllocatorDefault,(CFArrayRef)temp,kCFPropertyListMutableContainers);
      [temp release];
      

      【讨论】:

      • “仅包含数字字符串和数组”(以及日期和字典以及 NSData 和 NSNull)部分以及“创建不可变数组”部分仅在您使用 NSUserDefaults 或编写时才为真出一个PLIST。 PLIST(和用户默认值,相同格式)仅允许这些类型,但如果您的类可以存档/取消存档,它可以存储为 PLIST/用户默认值中的 NSData 实例就好了。如果您要使用密钥存档,正如 Anne 上面建议的那样,您不妨将此信息存储在其自己的文件中。不过,用户默认值 /plist 将适用于您描述的情况。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 2020-11-23
      • 1970-01-01
      • 2011-04-08
      • 1970-01-01
      相关资源
      最近更新 更多