美文网首页
iOS userDefaults 储存自定义对象序列化

iOS userDefaults 储存自定义对象序列化

作者: 高级搬砖工 | 来源:发表于2016-08-03 11:19 被阅读1681次

    userDefaults是用来储存一些信息量较小的数据的地方,根据key来定所要存取的内容。userDefaults可以存的数据类型有:NSArray, NSData, NSDictionary, NSMutableDictionary, NSString,NSURL。

    当我们有一些自定义的对象需要储存时我们去使用userDefaults发现会崩溃:

    Attempt to set a non-property-list object
    Property list invalid for format: 200 (property lists cannot contain objects of type 'CFType')

    告诉我们这是一个非属性列表里的对象是无效的,我们自定义的这个对象不属于上述数据类型,如果我们用数据库或其他的去存取相对来说会比较复杂没有userDefaults使用起来简单方便。

    一、userDefaults的基本用法

    userDefaults储存的时候数组是不可变的,就算你存进去的是可变数组,当你在取出来的时候也是一个不可变数组,所以这点大家要注意。
    所存内容的key是唯一的,相同的key存进去会覆盖相同key的内容。
    NSUserDefaults是一个单例,在整个程序中只有一个实例对象,他可以用于数据的永久保存,而且简单实用,这是它可以让数据自由传递的一个前提,也是大家喜欢用它保存简单数据的一个主要原因。

    • 储存BOOL类型
      NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];//初始化对象
      [userDetaults setObject:@(YES) forKey:@"MyBOOL"];
      [userDetaults synchronize];

      //取出
      BOOL myBool = [[[NSUserDefaults standardUserDefaults] objectForKey:@"MyBOOL"]boolValue];
      
    • 其他类型
      //相对应的key取出相对应的值,我们可以将它封装一下
      + (void)setData:(NSData /所要储存的数据类型*/)data forKey:(NSString *)key{
      NSUserDefaults *userDetaults = [NSUserDefaults standardUserDefaults];
      [userDetaults setObject:data forKey:key];//key是自己命名的字符串
      [userDetaults synchronize];
      }

      + (NSData */*所存的数据类型*/)dataForKey:(NSString *)key{
      
          return [[NSUserDefaults standardUserDefaults] objectForKey:key];
      }
      

    二、储存自定义的对象

    我的类的.h文件

    我有这样一个类,现在我想要把这个类的对象存到userDefaults里面。
    首先大家看这里:

    添加<NSCoding>

    添加之后我们回到.m在.m里添加如下方法:

     //自定义对象转换NSData
    - (void)encodeWithCoder:(NSCoder *)aCoder{
    
        [aCoder encodeObject:self.musicImageName forKey:@"musicImageName"];
        [aCoder encodeObject:self.musicName forKey:@"musicName"];
        [aCoder encodeObject:self.albumName forKey:@"albumName"];
        [aCoder encodeObject:self.filename forKey:@"filename"];
        [aCoder encodeObject:self.singer forKey:@"singer"];
        [aCoder encodeObject:self.singerIcon forKey:@"singerIcon"];
        [aCoder encodeBool:self.playing forKey:@"playing"];
    
    }
    
    - (instancetype)initWithCoder:(NSCoder *)aDecoder{
    
        if (self = [super init]) {
        self.musicImageName = [aDecoder decodeObjectForKey:@"musicImageName"];
        self.musicName = [aDecoder decodeObjectForKey:@"musicName"];
        self.albumName = [aDecoder decodeObjectForKey:@"albumName"];
        self.filename = [aDecoder decodeObjectForKey:@"filename"];
        self.singer = [aDecoder decodeObjectForKey:@"singer"];
        self.singerIcon = [aDecoder decodeObjectForKey:@"singerIcon"];
        self.playing = [aDecoder decodeBoolForKey:@"playing"];     
        }
        return self;
    }
    

    这样我们就把我们自定义的类转换为data型了。
    对于不同类型的转换:

    不同类型的转换

    自定义对象的存取

      //单独存一个自定义对象
      MPMusicInfoModel *model = [[MPMusicInfoModel alloc] init];
      model.musicName = @"空白格";
      NSData *data = [NSKeyedArchiver archivedDataWithRootObject:model]; 
      NSUserDefaults *userDetaults = [NSUserDefaults standardUserDefaults];
      [userDetaults setObject:data forKey:@"myMusic"];
      [userDetaults synchronize];
      //取出
      NSData *Data = [[NSUserDefaults standardUserDefaults] objectForKey:@"myMusic"];
      MPMusicInfoModel *model  = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    
      //存很多自定义对象。方法与存单个相同,但是要把对象放到数组里面然后在存进去
      NSData *data = [NSKeyedArchiver archivedDataWithRootObject:dataArray];//dataArray里面存的是MPMusicInfoModel类的对象。
      NSUserDefaults *userDetaults = [NSUserDefaults standardUserDefaults];
      [userDetaults setObject:data forKey:@"myMusicModelArray"];
      [userDetaults synchronize];
    
      NSData *Data = [[NSUserDefaults standardUserDefaults] objectForKey:@"myMusicModelArray"];
      NSArray *array  = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    

    userDefaults基本上是这样使用,如果还有更详细的还望多多指教。

    相关文章

      网友评论

          本文标题:iOS userDefaults 储存自定义对象序列化

          本文链接:https://www.haomeiwen.com/subject/saiijttx.html