终止应用程序由于未捕获的异常“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的这个问题只发生。其他一切似乎都工作正常,并且当我之前添加单个字符串时它工作正常。我真的想用这个来存储我的数组,尽管我可以管理它。
NSUserDefaults
仅支持plist对象,因此您无法将自定义对象保存到其中。您正在向数组中添加一个AG_Storage
类型的对象并将其保存,这是不允许的。您需要查看NSKeyedArchiving
,而不是将AG_Storage
与NSCoding
协议一致。让我知道你是否需要更多的指导。
文档说:
的类NSUserDefaults的提供用于访问 常见类型如浮标方便的方法,双打,整数,布尔值,和URL。一个 默认的对象必须是一个属性列表,也就是一个实例(集合或 的实例的组合):NSData的,的NSString, 的NSNumber,NSDate的,NSArray的,或者NSDictionary的
但你试图保存AG_Storage实例。如果你想存储任何类型的对象,你应该尝试序列化你的对象。例如要实现NSCoding协议。
所以我应该做一个本地NSMutableArray的内容'mainarray'?这会解决它还是我会不得不在课堂上声明所有这些信息来自? – user3430084
不,所有的NSMutableArray对象必须是:NSData,NSString,NSNumber,NSDate实例。 – Krivoblotsky
那么我该如何去转换它们呢?很抱歉,我对这些概念中的一些很陌生。我知道它不能存储,因为它是一个AG_Storage实例,但是如何设置数组以便我可以正确存储它?还有另一种方法可以保存比这更容易的数据吗?我将需要删除这些信息 – user3430084
看看这个回答类似的问题(我相信这是你有同样的问题):https://stackoverflow.com/a/19720674/694080
你AG_Storage不是默认符合NSCoding类之一。
如果有人提出这个问题,请确保在您保存的项目中没有null/nil,如果您尝试保存空对象,则会引发异常。
http://stackoverflow.com/questions/10305659/not-sure-how-to-handle-terminating-app-due-to-uncaught-exception-nsinvalidargu –