【问题标题】:Storing NSObjects in an NSMutableArray in NSUserDefaults将 NSObjects 存储在 NSUserDefaults 中的 NSMutableArray 中
【发布时间】:2011-02-21 19:14:26
【问题描述】:

如何成功地将 NSObjects 的 NSMutableArray 存储到 NSUserDefaults 中?

我尝试了一些东西,但它似乎不起作用。

这样做的正确方法是什么?

【问题讨论】:

  • 您存储的是实际的 NSObject 实例还是自定义子类的实例?
  • 我想存储一个 NSMutableArray 的 ALAssets

标签: iphone objective-c cocoa-touch


【解决方案1】:

来自文档:

请注意,默认值可以是 只有属性列表对象:NSData, NSString,NSNumber,NSDate,NSArray, 或 NSDictionary。

因此,您不能存储自定义NSObject

您可以做的是创建一个方法,将您的对象变成带有键的字典。

您还需要一个将字典转换为您的对象的方法。

一旦你有了NSObjects,你就可以使用这些属性列表对象:

//ObjectA could be a representation of your object using an NSDictionary.
NSMutableArray *objects = [[NSMutableArray alloc] initWithObjects:objectA, objectB, objectC, nil];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:objects forKey:@"StoredArray"];
[objects release];
//To save changes immediately
[defaults synchronize];

【讨论】:

  • OP 未尝试存储自定义对象。问题清楚地表明它是一个可变数组。
  • @Mark Adams:提问者对他们问题的评论清楚地表明他们想要存储一组自定义对象(ALAssets)。
  • @Peter Hosey:当我写答案时,此信息不可用,但我确保它涵盖了存储非属性列表对象。 @Helium3 需要编写一个将 ALAAsset 转换为可以存储的对象的方法,还需要编写一个将存储的对象转换回 ALAAsset 的方法。我能想到的一种方法是存储对 ALAsset 的引用而不是实际的 ALAAsset 并在必要时从库中检索它,但这取决于应用程序。
【解决方案2】:

来自NSUserDefaults 文档页面:

NSUserDefaults 返回的值是不可变的,即使您将可变对象设置为值。例如,如果您将可变字符串设置为 "MyStringDefault" 的值,那么您稍后使用 stringForKey: 检索的字符串将是不可变的。

您总是可以通过以下方式将不可变数组转换为可变数组:

NSMutableArray *mutable = [NSMutableArray arrayWithArray:immutable];

正如 Zebs 已经指出的,您只能将 plist-able 对象存储到NSUserDefaults(NSString、NSArray、NSDictionary、NSData、NSDate 和 NSNumber)中。 documentation 还声明:

对于NSArrayNSDictionary 对象,它们的内容必须是属性列表对象。

因此,如果您的数组包含自定义对象,则不能将其放入 NSUserDefaults

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    相关资源
    最近更新 更多