iOS基础——数据存储之沙盒机制、Plist、Perference、归档、反归档

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


一、沙盒机制

1、沙盒机制的介绍

iOS中的沙盒机制(SandBox)是一种安全体系,它规定了应用程序只能在为该应用创建的文件夹内读取文件,不可以访问其他地方的内容,所有的非代码文件都保存在这个地方,比如图片、声音、属性列表和文本文件等

其特点总结如下

  1. 每个应用程序都在自己的沙盒内
  2. 不能随意跨越自己的沙盒去访问别的应用程序沙盒的内容
  3. 应用程序向外请求或接收数据都需要经过权限认证

2、沙盒机制的沙盒目录

3、沙盒机制的沙盒结构

  1. Documents:保存应用运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录,例如游戏应用的存档等重要数据,保存相对重要的数据
  2. tmp:保存应用运行时所需要的临时数据,使用完事后再将相应的文件从该目录删除,应用没有运行时,系统也可能会清楚目录下的文件,iTunes同步设备时不会备份该目录,保存不重要的并且大的数据
  3. Library/Caches:保存应用运行时生成需要持久化的数据,iTunes同步设备时不会备份该目录,一般存储体积大,不需要备份的非重要数据
  4. Library/Preference:保存应用的所有偏好设置,iOS的Settings应用会在该目录中查找应用的设置信息,iTunes同步设备时会备份该目录,该目录由系统管理,无需我们来管理,通常用来存储一些基本的软件配置信息,比如记住密码等

4、沙盒机制的路径

① 获取沙盒路径

NSString *path = NSHomeDirectory();
NSLog(@"%@",path);

② 获取bundle路经

NSString *bundlePath = [NSBundle mainBundle].bundlePath;
NSLog(@"%@",bundlePath);

③ 获取Documents路径

NSString *documentPath = nil;
//第一种方式
documentPath = [NSHomeDirectory() stringByAppendingString:@"/Documents"];
//第二种方式
documentPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
//第三种方式
//Domains:领域,表示在用户的领域中找到Document路经
documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, NO) lastObject];

这里的第三种方式中参数三的YES和NO表示是否使用”~”代替根目录,我们可以通过打印结果看出区别

//YES:展开根目录
/Users/handsomexu/Library/Developer/CoreSimulator/Devices/CF6CF69B-8BF6-4394-BBF8-5D2C087038EF/data/Containers/Data/Application/FE1B9DEB-FC89-4398-A08A-108951F2672B/Documents
//NO:不展开根目录
~/Documents

④ 获取caches目录

NSString *cache = nil;
cache = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];

⑤ 获取tmp目录

NSString *tem = NSTemporaryDirectory();

二、Plist

数据存储方式有三种

  1. Plist
  2. Perference
  3. 归档和反归档

Plist文件通常用于储存用户设置,也可以存储必要的数据,相当于一个小数据库,但是不能存储对象

1、Plist存储

//创建数据,结尾必须要有一个nil参数,否则会报错
NSArray *arr = [NSArray arrayWithObjects:@"hensen",@"java", nil];
//创建路径
NSString *savePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]stringByAppendingPathComponent:@"data.plist"];
//写进文件
[arr writeToFile:savePath atomically:YES];

2、Plist读取

//创建路径
NSString *savePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]stringByAppendingPathComponent:@"data.plist"];
//获取数据
NSArray *getArr = [NSArray arrayWithContentsOfFile:savePath];
NSString *myName = getArr [0];
NSString *myLaugage = getArr [1];
NSLog(@"name:%@,laugage:%@",myName,myLaugage);

三、Perference

保存应用的所有偏好设置,该目录由系统管理,无需我们来管理,系统也为我们提供了API,但是不能存储对象

1、设置Perference

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setInteger:18 forKey:@"age"];
[defaults setObject:@"hensen" forKey:@"name"];
//同步,否则数据不会保存
[defaults synchronize];

2、获取Perference


NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSInteger *age = [defaults integerForKey:@"age"];
NSString *name = [defaults objectForKey:@"name"];

四、归档

归档和反归档其实就是序列化和反序列化,为了弥补Plist,Perference的不能存储对象的缺点,归档和反归档遵循NSCoding协议

1、准备工作

① 创建Model

#import <Foundation/Foundation.h>

@interface PersonModel : NSObject
@property(strong,nonatomic)NSString *name;
@property(assign,nonatomic)NSInteger age;
@end

② 遵循NSCoding协议

#import "PersonModel.h"

@interface PersonModel()<NSCoding>

@end

③ 实现NSCoding方法

//NSCoding的委托方法
-(instancetype)initWithCoder:(NSCoder *)aDecoder{
    if(self = [super init]){
        //存储对象
        self.name = [aDecoder decodeObjectForKey:@"name"];
        self.age = [aDecoder decodeIntegerForKey:@"age"];
    }
    return self;
}

2、归档

//创建路径
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];

五、反归档

反归档其实就是和归档做相反的操作,相当于装包和解包一个道理

1、准备工作

① 创建Model、遵循NSCoding协议

同上

② 实现NSCoding方法

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

2、反归档

//创建路径
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);

源码下载

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
iOS和安卓的沙盒是用来保护应用程序数据的安全性的一种机制。它们的主要区别如下: 1. 安全性:iOS沙盒机制相对安卓更加严格。iOS要求应用程序在自己的沙盒内运行,限制了应用之间的直接访问和交互。而安卓的沙盒机制相对较弱,应用程序可以更容易地访问和共享数据。 2. 文件系统结构:iOS沙盒机制将每个应用程序的文件分隔为多个目录,包括应用程序包、文档目录、缓存目录等。每个目录只能由特定的应用程序进行访问和写入。而安卓的沙盒机制通常是基于应用的用户ID,并且应用程序可以自由地向沙盒中的文件系统写入和访问。 3. 权限管理:iOS沙盒机制通过权限管理来限制应用程序对系统资源的访问。应用程序需要在安装时声明所需的访问权限,并由用户在使用时授予。而安卓的沙盒机制在应用程序安装时会一次性获取所有权限,并且用户只能在软件设置中进行修改。 4. 应用程序的更新:iOS沙盒机制要求每个应用程序都在单独的容器中运行,因此应用程序的更新通常是通过替换整个应用程序包来完成的。而安卓的沙盒机制允许应用程序在更新时只替换其中的部分文件,从而减少下载和更新时间。 综上所述,iOS和安卓的沙盒机制在安全性、文件系统结构、权限管理和应用程序更新方面存在一些差异。iOS沙盒机制相对更严格,保护了应用程序和用户数据的安全性,但也可能限制了应用程序之间的交互。而安卓的沙盒机制相对较弱,允许应用程序更自由地访问和共享数据,但也可能增加了安全隐患。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

许英俊潇洒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值