使用 NSUSERDEFAULTS

Working with NSUSERDEFAULTS

我正在尝试将 NSMutableArray 保存在 NSUserDefaults 中。这是我的代码

(void) alarmSetting :(AlarmObject *)alarmObject
{

    [alarmSelect addObject:alarmObject];

    time = alarmObject.clockDate;
    title = alarmObject.titleForAlarm;
    repeat = alarmObject.repeatData;
    video = alarmObject.titleOfTheVideo;
    double uniqueId = alarmObject.uniqueTime;
    ID = [NSNumber numberWithDouble:uniqueId];


    if(![[NSUserDefaults standardUserDefaults] objectForKey:@"MyAlarms"])
    {
        alarmToBeSaved= [[NSMutableArray alloc] init];

    }
    else
    {

        alarmToBeSaved=[[NSUserDefaults standardUserDefaults] valueForKey:@"MyAlarms"] ;

    }

   [alarmToBeSaved addObject:alarmObject];
    [[NSUserDefaults standardUserDefaults] setObject: alarmToBeSaved forKey:@"MyAlarms"];
    NSLog(@"%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"MyAlarms"]);
    [[NSUserDefaults standardUserDefaults] synchronize];

    [tbleView reloadData];

}

但是我收到一个错误

016-02-25 14:40:05.003 Alarm[3229:87627] Attempt to set a non-property-list object (
    "<AlarmObject: 0x7ff4807ecd80>"
) as an NSUserDefaults/CFPreferences value for key MyAlarms
2016-02-25 14:40:05.054 Alarm[3229:87627] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to insert non-property list object (
    "<AlarmObject: 0x7ff4807ecd80>"
) for key MyAlarms'

为什么会这样??我搜索了这个错误,我不明白,因为我在 NSUserDefaults.

中保存了一个数组

您发布的代码试图将一组自定义对象保存到 NSUserDefaults 中。当然,你不能那样做。实现 NSCoding 方法没有帮助,您只能在 NSUserDefaults 中存储 NSArray、NSDictionary、NSString、NSData、NSNumber 和 NSDate 等内容。

首先,您需要将对象转换为 NSData,然后将该 NSData 存储在 NSUserDefaults 中。如果需要,您甚至可以存储 NSData 的 NSArray。

当您读回数组时,您需要取消归档 NSData 以取回您的 BC_Person 对象。这是NSKeyedArchiver的逆过程。

保存

NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:yourObject];
[currentDefaults setObject:data forKey:@"yourKeyName"];

获取

NSData *data = [currentDefaults objectForKey:@"yourKeyName"];
yourObjectType * token = [NSKeyedUnarchiver unarchiveObjectWithData:data];
For Remove

[currentDefaults removeObjectForKey:@"yourKeyName"];

希望对您有所帮助:)