NSUserDefaults中NSMutableArray结构的错误是什么?"尝试插入非属性列表对象"

Dou*_*ith -2 c struct objective-c nsuserdefaults ios

我很只是想保存NSMutableArray/ NSArraystructS IN NSUserDefaults:

typedef struct {
    int key;
} provision;

provision p1;
p1.key = 4;
NSValue *p1Value = [NSValue value:&p1 withObjCType:@encode(provision)];

provision p2;
p2.key = 5;
NSValue *p2Value = [NSValue value:&p2 withObjCType:@encode(provision)];

NSMutableArray *provisions = [[NSMutableArray alloc] init];
[provisions addObject:p1Value];
[provisions addObject:p2Value];

[[NSUserDefaults standardUserDefaults] setObject:provisions forKey:@"Provisions"];
Run Code Online (Sandbox Code Playgroud)

我按照指南这里存储了所有的结构NSValue.但是最后一行会导致运行时错误:

*因未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'* - [NSUserDefaults setObject:forKey:]:尝试为关键项目插入非属性列表对象("<04000000>","<05000000>")

我究竟做错了什么?

Mar*_*n R 5

来自NSUserDefaults类参考:

默认对象必须是一个属性列表,即,(或对集合的实例的组合)的实例:NSData,NSString, NSNumber,NSDate,NSArray,或NSDictionary.如果要存储任何其他类型的对象,通常应将其存档以创建实例NSData.

发生异常是因为您尝试存储NSValue对象.要将结构存储NSData,请使用

NSData *p1data = [NSData dataWithBytes:&p1 length:sizeof(p1)];
Run Code Online (Sandbox Code Playgroud)

提取从它NSData

[p1data getBytes:&p1 length:sizeof(p1)];
Run Code Online (Sandbox Code Playgroud)