【问题标题】:Terminating app due to uncaught exception 'NSInvalidArgumentException', NSUserDefaults?由于未捕获的异常“NSInvalidArgumentException”,NSUserDefaults 而终止应用程序?
【发布时间】:2014-03-26 19:49:04
【问题描述】:

所以我在保存数组时遇到了 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 时才会发生。其他一切似乎都运行良好,当我早些时候添加单个字符串时它运行良好。如果我能管理它,我真的很想用它来存储我的数组。

【问题讨论】:

标签: ios objective-c nsuserdefaults


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    文档说:

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

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

    【讨论】:

    • 那么我应该用mainarray 的内容创建一个本地 NSMutableArray 吗?那会解决它还是我必须在所有这些信息来自的类中声明它?
    • 不,你所有的 NSMutableArray 对象必须是:NSData、NSString、NSNumber、NSDate 实例。
    • 那么我该如何转换它们呢?对不起,我对其中一些概念很陌生。我知道它无法存储,因为它是一个 AG_Storage 实例,但是如何设置数组以便正确存储它?有没有比这更容易的保存数据的方法?我也需要删除此信息
    【解决方案3】:

    看看这个对类似问题的回答(我相信这与您遇到的问题相同):https://stackoverflow.com/a/19720674/694080

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

    【讨论】:

      【解决方案4】:

      如果有人遇到此问题,请确保您保存的项目中没有 null/nil,如果您尝试保存 null 对象,这将引发异常。

      【讨论】:

        猜你喜欢
        • 2015-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多