尝试将非属性列表对象设置为NSUserDefaults [英] Attempt to set a non-property-list object as an NSUserDefaults

查看:116
本文介绍了尝试将非属性列表对象设置为NSUserDefaults的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我以为我知道导致这个错误的原因是什么,但我似乎无法弄明白我做错了什么。



这是我完整的错误信息获取:

 
尝试设置非属性列表对象(
< BC_Person:0x8f3c140>
)作为关键personDataArray的一个NSUserDefaults值

我有一个 Person 我认为符合 NSCoding 协议,我在我的班级中有这两种方法:

   - (void)encodeWithCoder:(NSCoder *)coder {
[coder encodeObject:self.personsName forKey:@BCPersonsName];
[coder encodeObject:self.personsBills forKey:@BCPersonsBillsArray];
}

- (id)initWithCoder:(NSCoder *)coder {
self = [super init];
if(self){
self.personsName = [coder decodeObjectForKey:@BCPersonsName];
self.personsBills = [coder decodeObjectForKey:@BCPersonsBillsArray];
}
return self;
}

在应用程序的某个时刻, NSString BC_PersonClass 中设置,我有一个 DataSave 类,我认为正在处理编码我的 BC_PersonClass 中的属性。
这里是我使用的代码,从 DataSave 类:

   - (void)savePersonArrayData:(BC_Person *)personObject 
{
// NSLog(@person%@,personObject.personsName);

[mutableDataArray addObject:personObject];

//将temp数组设置为mutableData数组
tempMuteArray = [NSMutableArray arrayWithArray:mutableDataArray];

//将person对象保存为nsData
NSData * personEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:personObject];

//首先将person对象添加到可变数组
[tempMuteArray addObject:personEncodedObject];

// NSLog(@数组%lu中的对象,(unsigned long)mutableDataArray.count);

//现在我们将数据数组设置为可变数组以保存
dataArray = [[NSArray alloc] initWithArray:mutableDataArray];
// dataArray = [NSArray arrayWithArray:mutableDataArray];

//将对象保存到NS用户默认值
NSUserDefaults * userData = [NSUserDefaults standardUserDefaults];
[userData setObject:dataArray forKey:@personDataArray];
[userData synchronize];
}

我希望这是足够的代码给你一个想法o我正在尝试去做。
再次,我知道我的问题在于我如何在我的BC_Person类中编码我的属性,我似乎无法弄清楚我在做错什么。



感谢您的帮助!

解决方案

您发布的代码尝试将自定义对象数组保存到 NSUserDefaults的。你不能这样做实现 NSCoding 方法没有帮助。您只能存储像 NSArray NSDictionary NSString NSData NSNumber NSDate NSUserDefaults



您需要将对象转换为 NSData 你有一些代码),并在 NSUserDefaults 中存储 NSData 。如果需要,您甚至可以存储 NSArray NSData



当您读回数组时,您需要取消存档 NSData 以取回您的 BC_Person 对象。 / p>

也许你想要这样:

   - (void)savePersonArrayData :( BC_Person *)personObject {
[mutableDataArray addObject:personObject];

NSMutableArray * archiveArray = [NSMutableArray arrayWithCapacity:mutableDataArray.count];
for(BC_Person * personObject in mutableDataArray){
NSData * personEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:personObject];
[archiveArray addObject:personEncodedObject];
}

NSUserDefaults * userData = [NSUserDefaults standardUserDefaults];
[userData setObject:archiveArray forKey:@personDataArray];
}


I thought I knew what was causing this error, but I can't seem to figure out what I did wrong.

Here is the full error message I am getting:

Attempt to set a non-property-list object (
   "<BC_Person: 0x8f3c140>"
) as an NSUserDefaults value for key personDataArray

I have a Person class that I think is conforming to the NSCoding protocol, where I have both of these methods in my person class:

- (void)encodeWithCoder:(NSCoder *)coder {
    [coder encodeObject:self.personsName forKey:@"BCPersonsName"];
    [coder encodeObject:self.personsBills forKey:@"BCPersonsBillsArray"];
}

- (id)initWithCoder:(NSCoder *)coder {
    self = [super init];
    if (self) {
        self.personsName = [coder decodeObjectForKey:@"BCPersonsName"];
        self.personsBills = [coder decodeObjectForKey:@"BCPersonsBillsArray"];
    }
    return self;
}

At some point in the app, the NSString in the BC_PersonClass is set, and I have a DataSave class that I think is handling the encoding the properties in my BC_PersonClass. Here is the code I am using from the DataSave class:

- (void)savePersonArrayData:(BC_Person *)personObject
{
   // NSLog(@"name of the person %@", personObject.personsName);

    [mutableDataArray addObject:personObject];

    // set the temp array to the mutableData array
    tempMuteArray = [NSMutableArray arrayWithArray:mutableDataArray];

    // save the person object as nsData
    NSData *personEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:personObject];

    // first add the person object to the mutable array
    [tempMuteArray addObject:personEncodedObject];

    // NSLog(@"Objects in the array %lu", (unsigned long)mutableDataArray.count);

    // now we set that data array to the mutable array for saving
    dataArray = [[NSArray alloc] initWithArray:mutableDataArray];
    //dataArray = [NSArray arrayWithArray:mutableDataArray];

    // save the object to NS User Defaults
    NSUserDefaults *userData = [NSUserDefaults standardUserDefaults];
    [userData setObject:dataArray forKey:@"personDataArray"];
    [userData synchronize];
}

I hope this is enough code to give you an idea o what I am trying to do. Again I know my problem lie with how I am encoding my properties in my BC_Person class, I just can't seem to figure out what though I'm doing wrong.

Thanks for the help!

解决方案

The code you posted tries to save an array of custom objects to NSUserDefaults. You can't do that. Implementing the NSCoding methods doesn't help. You can only store things like NSArray, NSDictionary, NSString, NSData, NSNumber, and NSDate in NSUserDefaults.

You need to convert the object to NSData (like you have in some of the code) and store that NSData in NSUserDefaults. You can even store an NSArray of NSData if you need to.

When you read back the array you need to unarchive the NSData to get back your BC_Person objects.

Perhaps you want this:

- (void)savePersonArrayData:(BC_Person *)personObject {
    [mutableDataArray addObject:personObject];

    NSMutableArray *archiveArray = [NSMutableArray arrayWithCapacity:mutableDataArray.count];
    for (BC_Person *personObject in mutableDataArray) { 
        NSData *personEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:personObject];
        [archiveArray addObject:personEncodedObject];
    }

    NSUserDefaults *userData = [NSUserDefaults standardUserDefaults];
    [userData setObject:archiveArray forKey:@"personDataArray"];
}

这篇关于尝试将非属性列表对象设置为NSUserDefaults的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆