• NSUserDefaults存储自定义类


     

    NSUserDefaults不是立即写入,而是根据时间戳定时的把缓存中的数据写入本地磁盘。所以调用了set方法之后数据有可能还没有写入磁盘应用程序就终止了。出现以上问题。可以通过调用synchornize方法强制写入。

    如果你想保存其他类型,如UIImage,你应该进行编码(即archive),或者将它转换为NSData、NSNumber或者NSString。

    NSUserDefaults只能保存诸如NSArray、NSDictionary、NSData、NSNumber等基本数据类型

     

    NSUserDefaultsDidChangeNotification

    那个方法只是通知了默认值的改变,要得到这个通知的具体内容还需要下面的代码:

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(defaultsChanged:) name:NSUserDefaultsDidChangeNotification object:nil];  

    NSUserDefaults数据存储的位置

      NSUserDefaults用于保存iPhone程序的数据,使用非常方便。

      那么这些数据最终存放在什么地方呢?存放于一个plist文件中。这个文件位于

      <UUID for your App>LibraryPreferences<your App's bundle ID>.plist

     

    NSUserDefaults只能保存诸如NSArray、NSDictionary、NSDataNSNumber等基本数据类型,如果我们强制保存自定义的类,就会出现这个错误:Attempt to set a non-property-list object as an NSUserDefaults value for ,解释起来:【试图将一个非属性列表对象设置为 NSUserDefaults】接下来就说说如何吧自定义的对象保存到NSUserDefaults中去。

    自定义的类实现<NSCoding>协议中的- (id) initWithCoder: (NSCoder *)coder方法和- (void) encodeWithCoder: (NSCoder *)coder方法

     

    #pragma mark NSCoding  

    - (id)initWithCoder:(NSCoder *)aDecoder{  // 解码  

        if (self == [super init]) {  

            alias = [aDecoder decodeObjectForKey:JSON_NAME];  

            mobile = [aDecoder decodeObjectForKey:JSON_MOBILE];  

            signtime = [[aDecoder decodeObjectForKey:JSON_TIMESTAMP] longValue];  

            endtime = [[aDecoder decodeObjectForKey:JSON_END_TIME] longValue];  

            cmobile = [aDecoder decodeObjectForKey:JSON_CMOBILE];  

        }  

        return self;  

    }  

      

    - (void)encodeWithCoder:(NSCoder *)aCoder{  // 编码

      

        [aCoder encodeObject:alias forKey:JSON_NAME];  

        [aCoder encodeObject:mobile forKey:JSON_MOBILE];  

        [aCoder encodeObject:[NSNumber numberWithLong:signtime] forKey:JSON_TIMESTAMP];  

        [aCoder encodeObject:[NSNumber numberWithLong:endtime] forKey:JSON_END_TIME];  

        [aCoder encodeObject:cmobile forKey:JSON_CMOBILE];  

      

    }  

     

    保存到NSUSerDefault:

     

    Terminal *terminal = [[Terminal alloc] init];  

      

    terminal.alias = [dict objectForKey:JSON_NAME];  

    terminal.mobile = [dict objectForKey:JSON_MOBILE];  

    terminal.signtime = [[dict objectForKey:JSON_TIMESTAMP] longValue];  

    terminal.endtime = [[dict objectForKey:JSON_END_TIME] longValue];  

    terminal.cmobile = [dict objectForKey:JSON_CMOBILE];  

      

    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:terminal];  

      

    [userDefaults setObject:data forKey:"test"];  

      

    [userDefaults synchronize];  

    也就是说,我们保存自定义对象时,是使用NSKeyedArchiver 把数据归档为NSData对象,然后把NSData存储到UserDefault中,NSData相当于Model

     

    读取:

     

    NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults];  

      

    NSData *data =  [userDefaults objectForKey:"test"];  

      

    return [NSKeyedUnarchiver unarchiveObjectWithData:data];  

     读取自定义对象时,先获取到NSData,然后使用NSKeyedUnarchiver解档为自定义的对象

    LOG输出,查看结果:

    2014-12-10 16:31:11.815 ESO_Etws[1463:60b] alias:Q611-0334

    2014-12-10 16:31:11.815 ESO_Etws[1463:60b] mobile:13841040334

    2014-12-10 16:31:11.815 ESO_Etws[1463:60b] signtime:1394529151000

    2014-12-10 16:31:11.816 ESO_Etws[1463:60b] endtime:1426065151000

    2014-12-10 16:31:11.816 ESO_Etws[1463:60b] cmobile: 

     

    PS:

    APP升级后,UserDefaults中原有的plist是不会删除的,除非用户卸载APP

     

    清除整个UserDefaults数据的方法:

    NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];  

    [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];  // 持久的

  • 相关阅读:
    Python修饰器 ,控制授权,通过ini配置文件 使用密钥 给函数限制试用期和过期后试用次数
    excel vba 自定义函数 使用正则表达式提取字符串
    python 值比较判断,np.nan is np.nan 却 np.nan != np.nan ,pandas 单个数据框/单元格 值判断nan
    python 读取中文CSV 'gbk' codec can't decode bytes in position 2-3:illegal multibyte sequence
    python ipython [Errno 22] invalid mode ('rb') or filename 、IDE工作路径
    windows下 python 添加PYTHONPATH 环境变量
    pandas(python2) 读取中文数据,处理中文列名
    qq邮箱 微信提醒不通知
    python :import error
    python推荐淘宝物美价廉商品 2.0
  • 原文地址:https://www.cnblogs.com/dengchaojie/p/4743430.html
Copyright © 2020-2023  润新知