因未捕获的异常终止应用程序' NSInvalidArgumentException',NSUserDefaults?

时间:2014-03-26 19:49:05

标签: ios objective-c nsuserdefaults

因此,在保存数组时,我遇到了NSUserDefaults的问题。我的所有代码都一直运行到这一点,但是当我尝试在NSUserDefaults中保存数组时,我开始遇到问题,主要是由于某些原因它现在无法保存。

- (IBAction)unwindToList:(UIStoryboardSegue *)segue
 {

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"MMMM dd, yyyy"];

AG_AddItemViewController *source = [segue sourceViewController];
AG_Storage *item = source.store;

NSDate *dateCreated = item.creationDate;



NSString *todayString = [dateFormat stringFromDate:self.todayDate];
NSString *dateCreatedString = [dateFormat stringFromDate:dateCreated];
NSString *tomorrowString = [dateFormat stringFromDate:self.tomorrowsDate];
NSString *yesterdayString = [dateFormat stringFromDate:self.yesterdaysDate];


//Set up file storage!

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];



if (item.itemName != nil) {

    if ([dateCreatedString isEqualToString:todayString]) {
        [self.mainArray addObject:item];
        [tableView reloadData];
        [defaults setObject:self.mainArray forKey:todayString];
        [defaults synchronize];

        NSLog(@"Saved");

    }
    else if ([dateCreatedString isEqualToString:tomorrowString]){
        [self.tomorrowArray addObject:item];
        [tableView reloadData];

        NSLog(@"THIS WORKED TOO :D");
    }
    else if ([dateCreatedString isEqualToString:yesterdayString]){
        [self.yesterdayArray addObject:item];
        [tableView reloadData];

        NSLog(@"THIS WORKED");
    }
    else{

    }
}
 }

mainarray和其他可变数组都在接口中声明为属性,因此它们不应该导致此问题。

2014-03-26 15:36:46.561 AgendaBk[32702:a0b] <AG_Storage: 0x8cc2c90>
     2014-03-26 15:36:46.563 AgendaBk[32702:a0b] Attempt to set a non-property-list object       (
     "<AG_Storage: 0x8cc2c90>"
     ) as an NSUserDefaults value for key March 26, 2014
     2014-03-26 15:36:46.565 AgendaBk[32702:a0b] *** Terminating app due to uncaught exception          'NSInvalidArgumentException', reason: '*** -[NSUserDefaults setObject:forKey:]: attempt to    insert non-property list object (
    "<AG_Storage: 0x8cc2c90>" ) for key March 26, 2014'

libc++abi.dylib: terminating with uncaught exception of type NSException

请注意,只有在我尝试启动NSUserDefaults时才会出现此问题。其他一切似乎都运行正常,当我早些时候添加单个字符串时,它运行正常。如果我可以管理它,我真的想用它来存储我的数组。

4 个答案:

答案 0 :(得分:0)

NSUserDefaults仅支持plist对象,因此您无法将自定义对象保存到其中。您将类型AG_Storage的对象添加到数组中并保存,这是不允许的。您需要通过NSKeyedArchiving符合AG_Storage协议来查看NSCoding。如果您需要更多指导,请告诉我。

答案 1 :(得分:0)

文档说:

  

NSUserDefaults类提供了便于访问的方法   常见类型,例如浮点数,双精度数,整数,布尔值和URL。一个   默认对象必须是属性列表,即(或   对于集合的实例组合):NSData,NSString,   NSNumber,NSDate,NSArray或NSDictionary

但是你试图保存AG_Storage实例。如果你想存储任何类型的对象,你应该尝试序列化你的对象。例如,实现NSCoding协议。

答案 2 :(得分:0)

看一下类似问题的答案(我相信你遇到了同样的问题):https://stackoverflow.com/a/19720674/694080

您的AG_Storage不是默认的NSCoding兼容类之一。

答案 3 :(得分:0)

如果有人提出这个问题,请确保您要保存的项目中没有 null / nil ,如果您有&#39;重新尝试保存一个空对象。