博客
关于我
iOS基础——数据存储之沙盒机制、Plist、Perference、归档、反归档
阅读量:717 次
发布时间:2019-03-21

本文共 3362 字,大约阅读时间需要 11 分钟。

iOS基础数据存储之沙盒机制、plist、perference归档反归档

一、沙盒机制

沙盒机制(SandBox)是iOS系统中的一个关键安全机制。它规定每个应用程序只能在自己专用的沙盒内存储和访问文件,无法跨越沙盒访问其他应用程序的内容。这种机制确保了应用程序的安全性和数据的孤立性。

沙盒机制的特点

  • 每个应用程序都有自己的沙盒,互不干扰
  • 应用程序无法随意访问其他沙盒的内容
  • 外部数据交流必须经过权限认证
  • 沙盒目录结构

    在沙盒中,主要包括以下几个目录:

    • Documents:保存需要持久化的应用数据,备份到iTunes会清理
    • tmp:存储临时性质的应用数据,自动清理,备份不会同步
    • Library/Caches:存储需要持久化但不重要的应用数据,不备份
    • Library/Preference:存储应用偏好设置,系统管理,备份时会同步

    获取沙盒路径

  • 获取主目录:

    NSString *path = NSHomeDirectory();
  • 获取应用程序的路径:

    NSString *bundlePath = [NSBundle mainBundle].bundlePath;
  • 获取Document目录:

    NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, NO) lastObject];

    改动后面的NOYES可以看到不同的路径表现

  • 获取Caches目录:

    NSString *cache = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, NO) lastObject];
  • 获取Temporary目录:

    NSString *tem = NSTemporaryDirectory();
  • 二、Plist

    Plist文件是iOS中常用的数据存储格式,起到类似数据库的作用,但不支持对象存储。主要用途包括保存用户设置和必要的应用数据。

    Plist操作示例

    • 写入Plist文件:
      NSString *savePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"data.plist"];NSArray *arr = [NSArray arrayWithObjects:@"hensen",@"java", nil];[arr writeToFile:savePath atomically:YES];
    • 读取Plist文件:
      NSString *savePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"data.plist";NSArray *getArr = [NSArray arrayWithContentsOfFile:savePath];NSString *myName = getArr[0];NSString *myLaugage = getArr[1];

    三、Perference

    Perference(偏好设置)用于存储应用的用户偏好配置,通常使用NSUserDefaults进行管理。该目录由系统管理,类似Keychain,需谨慎对待。

    Perference操作示例

    • 设置偏好:
      NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];[defaults setInteger:18 forKey:@"age"];[defaults setObject:@"hensen" forKey:@"name"];[defaults synchronize];
    • 获取偏好:
      NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];NSInteger *age = [defaults integerForKey:@"age"];NSString *name = [defaults objectForKey:@"name"];

    四、归档

    归档和反归档通过NSCoding协议实现对象的序列化和反序列化,弥补了Plist和Perference存储对象的短板。

    归档准备工作

  • 创建模型类:
    @interface PersonModel : NSObject@property (strong,nonatomic) NSString *name;@property (assign,nonatomic) NSInteger age;@end
  • 实现NSCoding协议:
    @interface PersonModel 
    @end
  • 归档实现

    -(nullable instancetype)initWithCoder:(NSCoder *)aDecoder{    if(self = [super init]){        self.name = [aDecoder decodeObjectForKey:@"name"];        self.age = [aDecoder decodeIntegerForKey:@"age"];    }    return self;}

    示例

    NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];NSString *fileName = [filePath stringByAppendingPathComponent:@"con.plist"];PersonModel *model = [[PersonModel alloc] init];model.name = @"hensen";model.age = 18;[NSKeyedArchiver archiveRootObject:model toFile:fileName];

    ##Five 反归档反归档即解包操作,核心是使用NSCoding协议恢复模型对象。

    反归档实现

    -(void)encodeWithCoder:(NSCoder *)aCoder{    [aCoder encodeObject:self.name forKey:@"name"];    [aCoder encodeInteger:self.age forKey:@"age"];}

    示例

    NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];NSString *fileName = [filePath stringByAppendingPathComponent:@"con.plist"]; PersonModel *person = [NSKeyedUnarchiver unarchiveObjectWithFile:fileName]; NSLog(@"name:%@,age:%ld", person.name, (long)person.age);

    通过合理运用沙盒机制、Plist、Perference、归档和反归档,可以有效管理iOS应用中的数据存储需求。尽管理论知识无误,但实际开发中建议根据具体项目需求灵活调整。

    转载地址:http://oevrz.baihongyu.com/

    你可能感兴趣的文章
    mysql 多字段删除重复数据,保留最小id数据
    查看>>
    MySQL 多表联合查询:UNION 和 JOIN 分析
    查看>>
    MySQL 大数据量快速插入方法和语句优化
    查看>>
    mysql 如何给SQL添加索引
    查看>>
    mysql 字段区分大小写
    查看>>
    mysql 字段合并问题(group_concat)
    查看>>
    mysql 字段类型类型
    查看>>
    MySQL 字符串截取函数,字段截取,字符串截取
    查看>>
    MySQL 存储引擎
    查看>>
    mysql 存储过程 注入_mysql 视图 事务 存储过程 SQL注入
    查看>>
    MySQL 存储过程参数:in、out、inout
    查看>>
    mysql 存储过程每隔一段时间执行一次
    查看>>
    mysql 存在update不存在insert
    查看>>
    Mysql 学习总结(86)—— Mysql 的 JSON 数据类型正确使用姿势
    查看>>
    Mysql 学习总结(87)—— Mysql 执行计划(Explain)再总结
    查看>>
    Mysql 学习总结(88)—— Mysql 官方为什么不推荐用雪花 id 和 uuid 做 MySQL 主键
    查看>>
    Mysql 学习总结(89)—— Mysql 库表容量统计
    查看>>
    mysql 实现主从复制/主从同步
    查看>>
    mysql 审核_审核MySQL数据库上的登录
    查看>>
    mysql 导入 sql 文件时 ERROR 1046 (3D000) no database selected 错误的解决
    查看>>