当您将数组或字典存储到 NSUserDefaults 中时,它会被压缩为磁盘上的 plist。这意味着您的自定义对象需要转换为可以存储在 plist 中的格式。有很多方法可以做到这一点,具体取决于您的对象所持有的数据类型,但此方法几乎适用于任何自定义对象,并且应该非常健壮。
感谢 Apple 精心设计的框架,实现起来非常简单:)
在您Program.h
添加<NSCoding>
协议。
@interface Program : NSObject <NSCoding>
然后在你Program.m
确保你实现以下方法。
#pragma mark - NSCoding
-(void)encodeWithCoder:(NSCoder *)encoder
{
// For each of the Program's properties that needs to be stored.
[encoder encodeObject:self.property forKey:@"PropertyKey"];
}
-(id)initWithCoder:(NSCoder *)decoder
{
if (self=[super init]) {
self.property = [decoder decodeObjectForKey:@"PropertyKey"];
}
return self;
}
此协议及其方法允许您的自定义对象动态编码和解码。这很重要,因此我们可以将您的对象转换为正确的格式。
接下来,我们将在存储阵列之前对其进行归档。所以用这个替换你的代码:
// Old Line
// [defaults setObject:tempArrayOfPrograms forKey:@"arrayOfPrograms"];
// New Lines
id archivedObject = [NSKeyedArchiver archivedDataWithRootObject:tempArrayOfPrograms];
[defaults setObject:archivedObject forKey:@"arrayOfPrograms"];
现在最后一步是确保您在退出时取消归档。因此,无论您从何处加载阵列,NSUserDefaults
请确保将其取消归档。
// Get the archived array.
id archivedObject = [[NSUserDefaults standardUserDefaults] objectForKey:@"arrayOfPrograms"];
// Unarchive the array.
NSArray *unarchivedArray = [NSKeyedUnarchiver unarchiveObjectWithData:archivedObject];
// Its already a mutable array if you put a mutable array in but just to be safe.
NSMutableArray *arrayFromDefaults = [NSMutableArray arrayWithArray:unarchivedArray];