Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 将NSMutableArray存储为NSUserDefaults_Objective C_Nsmutablearray_Nsuserdefaults - Fatal编程技术网

Objective c 将NSMutableArray存储为NSUserDefaults

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中了

在本例中,我希望将NSMutableArray存储到NSUserDefaults。我很清楚,您只能将不可变对象存储到此“文件”中

我尝试了以下代码来加载NSMutableArray:

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;

但是,NSUDER Debug是为了存储简单的数据而设计的,如果您想保存更多的自定义对象,您应该考虑将其保存到文件中,查看NKEKEDAGEVER可能会更适合您。请记住,如果要使用NSKeyedArchiver保存自定义对象,该对象也应符合NSCoding协议,并且必须在上面添加这两种方法。

您无法将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;

但是,NSUDER Debug是为了存储简单的数据而设计的,如果您想保存更多的自定义对象,您应该考虑将其保存到文件中,查看NKEKEDAGEVER可能会更适合您。请记住,如果要使用NSKeyedArchiver保存自定义对象,该对象也应符合NSCoding协议,并且必须在上面添加这两种方法。

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,然后使用NSKeyedArchiver

  • 使用CoreData

  • 一个非常好的教程以及两者的比较可以在这里找到:

    您的两个选项是:

  • MyObject
    中执行NSCoding,然后使用NSKeyedArchiver

  • 使用CoreData


  • 在这里可以找到一个非常好的教程以及两者的比较:

    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