Objective c 将NSMutableArray存储为NSUserDefaults
首先:大家圣诞快乐!我已经有一段时间没有将数据存储到NSUserDefaults中了 在本例中,我希望将NSMutableArray存储到NSUserDefaults。我很清楚,您只能将不可变对象存储到此“文件”中 我尝试了以下代码来加载NSMutableArray:Objective c 将NSMutableArray存储为NSUserDefaults,objective-c,nsmutablearray,nsuserdefaults,Objective C,Nsmutablearray,Nsuserdefaults,首先:大家圣诞快乐!我已经有一段时间没有将数据存储到NSUserDefaults中了 在本例中,我希望将NSMutableArray存储到NSUserDefaults。我很清楚,您只能将不可变对象存储到此“文件”中 我尝试了以下代码来加载NSMutableArray: NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; self.mutableArray = [[NSMutableArray alloc] initW
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
self.mutableArray = [[NSMutableArray alloc] initWithArray: [defaults objectForKey:@"TestKey"]];
我使用以下代码存储数据:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSArray *tempArr = [NSArray arrayWithArray:self.mutableArray];
[defaults setObject:tempArr forKey:@"TestKey"];
[defaults synchronize];
不幸的是,模拟器退出时出现以下错误:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSUserDefaults setObject:forKey:]: attempt to insert non-property list object (
"<MyObject: 0x10dfb40a0>"
) for key TestKey'
由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'***-[NSUserDefaults setObject:forKey:::尝试插入非属性列表对象(
""
)对于键TestKey'
可变数组包含多个对象
有人知道我把事情搞砸了吗?您不能将tempArr保存到NSUserDefaults,因为正如您在注释中所示,此数组包含自定义对象MyObject的子类。如果要将其保存为NSUserDefaults,则应实现NSCoding协议并添加两种方法:
- (void)encodeWithCoder:(NSCoder *)encoder {
//Encode all yours properties, vars
[encoder encodeObject:self.property1 forKey:@"property1"];
[encoder encodeObject:self.property2 forKey:@"property2"];
}
- (id)initWithCoder:(NSCoder *)decoder {
if((self = [super init])) {
//decode all yours properties, vars
self.property1 = [decoder decodeObjectForKey:@"property1"];
self.property2 = [decoder decodeObjectForKey:@"property2"];
}
return self;
- (void)encodeWithCoder:(NSCoder *)encoder {
//Encode all yours properties, vars
[encoder encodeObject:self.property1 forKey:@"property1"];
[encoder encodeObject:self.property2 forKey:@"property2"];
}
- (id)initWithCoder:(NSCoder *)decoder {
if((self = [super init])) {
//decode all yours properties, vars
self.property1 = [decoder decodeObjectForKey:@"property1"];
self.property2 = [decoder decodeObjectForKey:@"property2"];
}
return self;
NSUserDefaults
无法处理自定义对象
从苹果文档:
默认对象必须是属性列表,即(或)的实例
对于集合:NSData、NSString、,
NSNumber、NSDate、NSArray或NSDictionary。如果你想储存任何
对于其他类型的对象,通常应将其存档以创建
NSData的实例
对于自定义对象,可以将其转换为这些对象之一,或者为类实现NSCoder
协议以创建NSData
表示
对于少量以上的参数,最佳选择是
CoreData
或NSKeyedArchiver
保存到文档目录中的文件。NSUserDefaults
无法处理自定义对象
从苹果文档:
默认对象必须是属性列表,即(或)的实例
对于集合:NSData、NSString、,
NSNumber、NSDate、NSArray或NSDictionary。如果你想储存任何
对于其他类型的对象,通常应将其存档以创建
NSData的实例
对于自定义对象,可以将其转换为这些对象之一,或者为类实现NSCoder
协议以创建NSData
表示
对于少量以上的参数,最佳选择是CoreData
或NSKeyedArchiver
保存到文档目录中的文件。您可以尝试以下方法:
存档:
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:YOUR_MUTABLE_ARRAY];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"myarray"];
[[NSUserDefaults standardUserDefaults] synchronize];
NSData*data=[NSKeyedArchivedDataWithRootObject:您的可变数组];
[[NSUserDefaults standardUserDefaults]设置对象:数据分叉:@“myarray”];
[[NSUserDefaults standardUserDefaults]同步];
要取消归档:
NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:@"myarray"];
NSMutableArray *mArr = [NSKeyedUnarchiver unarchiveObjectWithData:data];
NSData*data=[[NSUserDefaults standardUserDefaults]objectForKey:@“myarray”];
NSMutableArray*mArr=[NSKeyedUnarchiver unarchiveObjectWithData:data];
您可以尝试以下方法:
存档:
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:YOUR_MUTABLE_ARRAY];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"myarray"];
[[NSUserDefaults standardUserDefaults] synchronize];
NSData*data=[NSKeyedArchivedDataWithRootObject:您的可变数组];
[[NSUserDefaults standardUserDefaults]设置对象:数据分叉:@“myarray”];
[[NSUserDefaults standardUserDefaults]同步];
要取消归档:
NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:@"myarray"];
NSMutableArray *mArr = [NSKeyedUnarchiver unarchiveObjectWithData:data];
NSData*data=[[NSUserDefaults standardUserDefaults]objectForKey:@“myarray”];
NSMutableArray*mArr=[NSKeyedUnarchiver unarchiveObjectWithData:data];
你的两个选择是:
MyObject
中执行NSCoding,然后使用NSKeyedArchiverMyObject
中执行NSCoding,然后使用NSKeyedArchiver在这里可以找到一个非常好的教程以及两者的比较:self.mutableArray中的内容是什么?self.mutableArray包含由NSString元素组成的NSObjects标记tempArr的值并检查它是否包含数据nslog打印:tempArr是:(“”)
NSUserDefaults
不能包含NSObject
s,请参阅文档:默认对象必须是属性列表,即NSData、NSString、NSNumber、NSDate、NSArray或NSDictionary的实例(或实例的组合)。您必须将NSObject
转换为其中一个。self.mutableArray中有什么?self.mutableArray包含由NSString元素组成的NSObjects记录tempArr的值并检查它是否包含数据nslog打印:tempArr是:(“”)nsserdefaults
不能包含NSObject
s,请参阅文档:默认对象必须是属性列表,即NSData、NSString、NSNumber、NSDate、NSArray或NSDictionary的实例(或集合实例的组合)。您必须转换您的NSObject