在使用NSUserDefaults的時候插入數據有時候會報如下錯誤:Attempt to set a non-property-list objec數組
這種錯誤的緣由是插入了不識別的數據類型,NSUserDefaults支持的數據類型有NSString、 NSNumber、NSDate、 NSArray、NSDictionary、BOOL、NSInteger、NSFloat等系統定義的數據類型。app
解決辦法把數組歸檔以後再進行存儲直接上代碼atom
模型數據的代碼spa
#import <Foundation/Foundation.h> @interface itemModel : NSObject @property(nonatomic,copy)NSString* name; @property(nonatomic,copy)NSString* number; - (instancetype)initWithDict:(NSDictionary *)dict; + (instancetype)appInfoWithDict:(NSDictionary *)dict; + (NSArray *)appinfoArrayWithArray:(NSArray *)array; @end
#import "itemModel.h" @interface itemModel () @end @implementation itemModel - (instancetype)initWithDict:(NSDictionary *)dict { self = [super init]; if (self) { [self setValuesForKeysWithDictionary:dict]; } return self; } + (instancetype)appInfoWithDict:(NSDictionary *)dict { return [[self alloc] initWithDict:dict]; } -(void)setValue:(id)value forUndefinedKey:(NSString *)key{ } + (NSArray *)appinfoArrayWithArray:(NSArray *)arr { NSMutableArray *arrayM = [NSMutableArray array]; for (NSDictionary *dict in arr) { [arrayM addObject:[self appInfoWithDict:dict]]; } return arrayM; } -(void)encodeWithCoder:(NSCoder *)aCoder { [aCoder encodeObject:_name forKey:@"name"]; [aCoder encodeObject:_number forKey:@"number"]; } - (id)initWithCoder:(NSCoder*)aDecoder { if (self = [super init]) { _name = [aDecoder decodeObjectForKey:@"name"]; _number = [aDecoder decodeObjectForKey:@"number"]; } return self; } @end
使用方法
//解檔得到數組
NSData * data= [[NSUserDefaults standardUserDefaults]objectForKey:@"key"]; NSArray * appArray = [NSKeyedUnarchiver unarchiveObjectWithData:data]; NSMutableArray * mut = [NSMutableArray arrayWithArray:appArray]; [mut addObject:mode]; //歸檔存儲數組 NSData *data1 = [NSKeyedArchiver archivedDataWithRootObject:[mut mutableCopy]]; [userDefaults setObject:data1 forKey:@"key"]; [userDefaults synchronize];