终止应用程序由于未捕获的异常“NSInvalidArgumentException”,NSUserDefaults?

问题描述:

所以我在保存数组时遇到NSUserDefaults问题。我所有的代码一直工作到这一点,但只要我试图将数组保存在NSUserDefaults中,我开始出现问题,主要是因为某些原因它现在不能保存。终止应用程序由于未捕获的异常“NSInvalidArgumentException”,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的这个问题只发生。其他一切似乎都工作正常,并且当我之前添加单个字符串时它工作正常。我真的想用这个来存储我的数组,尽管我可以管理它。

+0

http://*.com/questions/10305659/not-sure-how-to-handle-terminating-app-due-to-uncaught-exception-nsinvalidargu –

NSUserDefaults仅支持plist对象,因此您无法将自定义对象保存到其中。您正在向数组中添加一个AG_Storage类型的对象并将其保存,这是不允许的。您需要查看NSKeyedArchiving,而不是将AG_StorageNSCoding协议一致。让我知道你是否需要更多的指导。

文档说:

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

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

+0

所以我应该做一个本地NSMutableArray的内容'mainarray'?这会解决它还是我会不得不在课堂上声明所有这些信息来自? – user3430084

+0

不,所有的NSMutableArray对象必须是:NSData,NSString,NSNumber,NSDate实例。 – Krivoblotsky

+0

那么我该如何去转换它们呢?很抱歉,我对这些概念中的一些很陌生。我知道它不能存储,因为它是一个AG_Storage实例,但是如何设置数组以便我可以正确存储它?还有另一种方法可以保存比这更容易的数据吗?我将需要删除这些信息 – user3430084

看看这个回答类似的问题(我相信这是你有同样的问题):https://*.com/a/19720674/694080

你AG_Storage不是默认符合NSCoding类之一。

如果有人提出这个问题,请确保在您保存的项目中没有null/nil,如果您尝试保存空对象,则会引发异常。