iOS沙盒及数据存储

时间久了容易忘,针对沙盒的相关实用技巧做一个记录和整理。

一、iOS数据存储常用方式

 1、XML属性列表(plist)

 不是所有对象都可以写入;

 2、Preference(偏好设置)

 本质还是通过“plist”来存储数据,但是使用简单(无需关注文件、文件夹路径和名称);

 3、NSKeyedArchiver归档(NSCoding)

 把任何对象,直接保存为文件的方式;

 4、SQLite3

 当非常大量的数据存储时使用;

 5、CoreData

 就是对SQLite的封装。

 本文只做前三种研究

 

 二、沙盒概述

 1、每个iOS应用都有自己的应用沙盒(应用沙盒就是应用的文件夹),与其他文件系统隔离。

 2、应用必须呆在自己的沙盒里,其他应用不能访问该沙盒。

 3、区别Bundle路径(app的安装目录),沙盒是app的存储路径。

 4、应用沙盒的文件系统目录如下:

 

三、沙盒结构

 1、Documents:保存应用运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录。例如,游戏应用可将游戏存档保存在该目录。保存相对重要的数据。

 2、tmp:保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时不会备份该目录。保存不重要的并且大的数据。

 3、Library/Caches:保存应用运行时生成的需要持久化的数据,iTunes同步设备时不会备份该目录。一般存储体积大、不需要备份的非重要数据

 4、Library/Preference:保存应用的所有偏好设置,iOS的Settings(设置)应用会在该目录中查找应用的设置信息。iTunes同步设备时会备份该目录。该目录由系统管理, 无需我们来管理。通常用来存储一些基本的软件配置信息, 比如记住密码、自动登录等。

 

四、沙盒路径的获取以及路径的拼接

 1、沙盒根目录:NSHomeDirectory()

 2、4个文件夹路径

 (1)document:

 [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]

 (2)library:

 [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];

 (3)tmp:

  NSTemporaryDirectory()

 (4)caches:

 [NSSearchPathForDirectoriesInDomains(NSCachesDirectory(), NSUserDomainMask, YES) lastObject];

 

3、关于路径的备注:

 (1)参数: NSUserDomainMask 代表从用户文件夹下找; YES 代表展开路径中的波浪字符“~”。

 (2)NSSearchPathForDirectoriesInDomains方法,返回的是数组,在iOS中,只有一个目录跟传入的参数匹配,所以这个集合里面只有一个元素。

4、路径的拼接

(1)strA stringByAppendingPathComponent:@“data.plist” :此方法不用考虑strA中的“/”符号。

 

五、iOS数据存储的三种方式

 1、writeToFile ,直接写成plist文件,存储类型不是任意对象

 例:[data writeToFile:path atomically:Yes] ; data为NSdata类型对象,path为存储路径,Yes为线程保护。

 2、NSUserDefaults偏好设置存储,不需要路径,注意使用同步

 (1)获取偏好设置对象

   NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

 (2)存储数据

  [defaults setObject:@"小明" forKey:@"name"];

  [defaults setInteger:100 forKey:@"money"];

  [defaults setBool:NO forKey:@“isSame”];

 

 (3)立即同步(防止数据丢失,强制同步更新,系统有时会延时处理)

  [defaults synchronize];

 (4)读取数据   

    NSString * name = [defaults objectForKey:@"name"];

    NSInteger money = [defaults integerForKey:@"money"];

    BOOL isOrNot = [defaults boolForKey:@"isSame"];

 

 (5)偏好设置存储新的数据,不会覆盖原有文件,会在原文件里面续写。 

3、NSKeyedArchiver归档

(1)如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,可以直接用NSKeyedArchiver进行归档和恢复,不是所有的对象都可以直接用这种方法进行归档,只有遵守了NSCoding协议的对象才可以。

(2)归档 ,例:[NSKeyedArchiver archiveRootObject:p toFile:path]; path为路径 

(3)解档(反归档),例:Person *p =  [NSKeyedUnarchiver  unarchiveObjectWithFile:path];

(4)遵守 NSCoding 协议(2个方法),存储哪种类型的对象,就在其类实现中重写以下方法。

"归档"只是存储数据的过程,每次归档对象时,都会调用这个方法。这是告诉系统对象的哪些属性需要存储,该如何存储;若该属性没写则不会存储进去。

复制代码
-(void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:self.name forKey:@"name"];

    [aCoder encodeInt:self.girl forKey:@"girl"];

    [aCoder encodeBool:self.sure forKey:@"sure"];   

} 
复制代码

"反归档"只是读取数据的过程,每次从文件中恢复(解码)对象时,都会调用这个方法。这是告诉系统取出的哪些数据赋值给对象的哪些属性,若该属性没写不会获取出来,注意super的调用。

复制代码
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
    if(self = [super init]){

        self.name =  [aDecoder  decodeObjectForKey:@"name"];

        self.girl = [aDecoder decodeIntForKey:@"girl"];

        self.sure = [aDecoder decodeBoolForKey:@"sure"];    
    }
    return self;
}

 
复制代码

 

posted @   执着的怪味豆  阅读(472)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示