目录:

一、沙盒机制

二、用户偏好设置

三、归档

一、沙盒机制

每个iOS应⽤都有⾃己的应用沙盒(应⽤沙盒就是⽂件系统⽬录),与其他文件系统隔离。应⽤必须待在⾃己的沙盒⾥,其他应用不能访问该应用沙盒的文件系统目录,如下图所示(假设应⽤的名称叫Layer)(在ios8中,是对其开放的,用户可以访问其他沙河的文件系统目录)。
 

iOS应用沙盒结构分析

应用程序包:(Bundle)包含了所有的资源文件和可执行文件
Documents:保存应用运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录。例如,游戏应用可将游戏存档保存在该目录
Library/Caches:保存应用运行时生成的需要持久化的数据,iTunes同步设备时不会备份该目录。一般存储体积较大、不需要备份的非重要数据
Library/Preference:保存应用的所有偏好设置,iOS的设置应用会在该目录中查找应用的设置信息。iTunes同步设备时会备份该目录
tmp:保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时不会备份该目录
常用的代码操作,如下;
   //获取home目录
NSString *homePath = NSHomeDirectory();
NSLog(@"home%@",homePath); //获取documents目录
//方式1:
NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath = [documents lastObject];
NSLog(@"%@",documentsPath);
//方式2:拼接字符串
NSString *documentPath2 = [homePath stringByAppendingPathComponent:@"Documents"];
NSLog(@"documenPath2:%@",documentPath2); //获取caches缓存目录
NSArray *caches = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachesPath = [caches lastObject];
NSLog(@"cachesPath:%@",cachesPath); //获取临时目录
NSString *tmp = NSTemporaryDirectory();
NSLog(@"tmp:%@",tmp); //在documents目录下创建文件
NSFileManager *fm = [NSFileManager defaultManager];
NSString *fileName = [documentsPath stringByAppendingPathComponent:@"1.txt"];
NSString *str = @"hello world";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding]; if ([fm createFileAtPath:fileName contents:data attributes:nil]) {
NSLog(@"file create successful");
} //读出文件的内容
NSError *error = nil; NSString *str2 = [NSString stringWithContentsOfFile:fileName encoding:NSUTF8StringEncoding error:&error];
if (!error) {
NSLog(@"str2:%@",str2);
}
else
{
NSLog(@"%@",error);
}
//NSBundle对象:图片、xib、storyBoard、plist文件都是放在应用程序包中
NSBundle *bundle = [NSBundle mainBundle];
//获取包中文件的路径;
NSString *path = [bundle pathForResource:@"array" ofType:@"plist"];
//加载包中的xib文件
NSArray *views = [bundle loadNibNamed:@"cell" owner:self options:nil];

二、Preference(用户偏好设置)

很多iOS应⽤用都⽀持偏好设置,⽐如保存⽤户名、密码、字体⼤小等设置, iOS提供了⼀套标准的解决⽅案来为应用加⼊偏好设置功能
每个应⽤都有个NSUserDefaults实例,通过它来存取偏好设置。

1)偏好设置是专门用来保存应用程序的配置信息的, 一般情况不要在偏好设置中保存其他数据。如果利用系统的偏好设置来存储数据, 默认就是存储在Preferences文件夹下面的,偏好设置会将所有的数据都保存到同一个文件中。

2)使用偏好设置对数据进行保存之后, 它保存到系统的时间是不确定的,会在将来某一时间点自动将数据保存到Preferences文件夹下面,如果需要即刻将数据存储,可以使用[defaults synchronize];

3)注意点:所有的信息都写在一个文件中,对比简单的plist可以保存和读取基本的数据类型。

4)步骤:获取NSuserDefaults,保存(读取)数据

代码参考如下:

创建用户偏好设置,保存信息
#import "AppDelegate.h"
......
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//创建用户偏好设置对象
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:@"admin" forKey:@"userName"];
[userDefaults setObject:@"" forKey:@"userPassword"];
[userDefaults setInteger: forKey:@"loginTime"];
[userDefaults setObject: [NSDate date] forKey:@"loginDate"];
//同步保存
[userDefaults synchronize]; NSLog(@"%@",NSHomeDirectory());
return YES;
}
...... //创建偏好设置,读取信息(注意:NSUserDefaults是单例对象)
#import "ViewController.h"
......
- (void)viewDidLoad {
[super viewDidLoad];
NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
NSString *userName = [userDefault objectForKey:@"userName"];
NSString *userPassword = [userDefault objectForKey:@"userPassword"];
NSInteger loginTime = [userDefault integerForKey:@"loginTime"];
NSDate *loginDate = [userDefault objectForKey:@"loginDate"];
NSDateFormatter *df = [[NSDateFormatter alloc]init];
NSString *Date = [df stringFromDate:loginDate]; NSLog(@"%@,%@,%ld,%@",userName,userPassword,loginTime,loginDate);
}
......

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

三、NSKeyedArchiver(归档)

1.如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,可以直接⽤用NSKeyedArchiver进⾏行归档和恢复

//创建需要归档的对象数据
NSArray *array = @[@,@,@,@];
//创建拼接路径
NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [documents lastObject];
NSString *archiverPath = [path stringByAppendingPathComponent:@"archiver.arc"];
//执行归档操作
if ([NSKeyedArchiver archiveRootObject:array toFile:archiverPath])
{
NSLog(@"归档成功");
}
else
{
NSLog(@"归档失败");
}
//打印Home目录
NSLog(@"%@",NSHomeDirectory());
//解归档操作
NSArray *array2 = [NSKeyedUnarchiver unarchiveObjectWithFile:archiverPath];
NSLog(@"%@",array2);

2.不是所有的对象都可以直接用这种方法进行归档,只有遵守了NSCoding协议的对象才可以,NSCoding协议有2个⽅方法: 实例变量,可以使用encodeObject:forKey:⽅法归档实例变量

◆ initWithCoder:
每次从⽂件中恢复(解码)对象时,都会调⽤这个方法。⼀般在这个⽅法⾥面指定如何解码文件中的数据为对象的实例变量,可以使用decodeObject:forKey⽅法解码实例变量
◆ encodeWithCoder:
每次归档对象时,都会调⽤这个方法。⼀般在这个⽅法⾥面指定如何归档对象中的每个实例变量
代码如下:
ViewController.m文件代码如下:
#import "ViewController.h"
#import "Person.h"
......
[super viewDidLoad];
Person *person = [[Person alloc]init];
person.name = @"zhangsan";
person.age = ;
person.gender = 'F'; //拼接保存路径
NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [documents lastObject];
NSString *archiverPath = [path stringByAppendingPathComponent:@"archiver.arc"];
//执行归档操作
if ([NSKeyedArchiver archiveRootObject:person toFile:archiverPath]) {
NSLog(@"归档成功");
}
else
{
NSLog(@"归档失败");
}
NSLog(@"%@",NSHomeDirectory());
//解归档,创建新的对象
Person *person2 = [NSKeyedUnarchiver unarchiveObjectWithFile:archiverPath];
NSLog(@"%@",person2); .....
Person.m代码如下:
#import "Person.h" @implementation Person
-(instancetype)initWithName:(NSString *)name andAge:(NSInteger)age andGender:(char)gender
{
if (self = [super init]) {
_name = [name copy];
_age = age;
_gender = gender;
}
return self;
}
-(NSString *)description
{
return [NSString stringWithFormat:@"name:%@,age:%ld,gender:%c",_name,_age,_gender];
}
-(void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeInteger:self.age forKey:@"age"];
[aCoder encodeInteger:self.gender forKey:@"gender"];
}
-(id)initWithCoder:(NSCoder *)aDecoder
{
self.name = [aDecoder decodeObjectForKey:@"name"];
self.age = [aDecoder decodeIntegerForKey:@"age"];
self.gender = [aDecoder decodeIntegerForKey:@"gender"];
return self;
}
@end

NSKeyedArchiver-归档对象的注意如果⽗类也遵守了NSCoding协议,请注意:
应该在encodeWithCoder:⽅法中加上⼀一句 [super encodeWithCode:encode];
确保继承的实例变量也能被编码,即也能被归档
应该在initWithCoder:⽅法中加上⼀一句self = [super initWithCoder:decoder];
确保继承的实例变量也能被解码,即也能被恢复

3.NSData进行多个对象归档

  NSString *userName = @"zhangsan";
NSInteger age = ;
NSString *address = @"北京尚学堂";
//创建一个可变数据区,用于保存对象
NSMutableData *data = [[NSMutableData alloc]init]; //拼接路径
NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [documents lastObject];
NSString *archiverPath = [path stringByAppendingPathComponent:@"archiver.arc"];
//创建归档对象,将要归档的对象加入data可变数据区中
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
//归档操作
[archiver encodeObject:userName forKey:@"name"];
[archiver encodeInteger:age forKey:@"age"];
[archiver encodeObject:address forKey:@"address"];
//结束归档
[archiver finishEncoding];
//将data的数据写入到文件中,保存起来。
[data writeToFile:archiverPath atomically:YES]; //创建新的可变数据区
NSMutableData *data2 = [NSMutableData dataWithContentsOfFile:archiverPath];
//解归档操作
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data2];
NSString *name = [unarchiver decodeObjectForKey:@"name" ];
NSInteger age2 = [unarchiver decodeIntegerForKey:@"age"];
NSString *address2 = [unarchiver decodeObjectForKey:@"address"];
NSLog(@"name:%@,age:%ld,address:%@",name,age2,address2);

iOS_数据存取(一)的更多相关文章

  1. iOS_数据存取(二)

    本节内容目录: 一.SQLite3 二.Core Data 一.SQlite3 SQLite3是⼀款开源的嵌入式关系型数据库,可移植性好.易使用.内存开销小SQLite3是⽆类型的,意味着你可以保存任 ...

  2. JavaScript数据存取的性能问题

    JavaScript中四种基本的数据存取位置: 字面量:只代表自身 字符串.数字.布尔值.对象.函数.数组.正则,以及null和undefined    快 本地变量:var定义的    快 数组元素 ...

  3. Hyperledger中数据存取的实现

    简介 本文介绍了在Hyperledger中数据存取的实现. API接口 Hyperledger提供基于key/value的数据存储,其中key是字符串,value则是二进制字节数组,Hyperledg ...

  4. 高性能JS笔记2——数据存取

    数据存取性能而言: 字面量>本地变量>数组元素>对象成员 一.标识符解析的性能 标识符解析是有代价的,一个标识符的位置越深,它的读写速度也就越慢. 局部变量的读写速度是最快的,全局变 ...

  5. Laxcus大数据管理系统2.0(5)- 第三章 数据存取

    第三章 数据存取 当前的很多大数据处理工作,一次计算产生几十个GB.或者几十个TB的数据已是正常现象,驱动数百.数千.甚至上万个计算机节点并行运行也已经不足为奇.但是在数据处理的后面,对于这种在网络间 ...

  6. 使用文本文件(.txt)进行数据存取的技巧总结(相当的经典)

    使用文本文件(.txt)进行数据存取的技巧总结(相当的经典) 使用文本文件(.txt)进行数据存取的技巧总结 由于本帖内容较多,部分转自他人的心得,因此,凡转贴的地方仅用“----转----”标注,原 ...

  7. 数据分析与展示——NumPy数据存取与函数

    NumPy库入门 NumPy数据存取和函数 数据的CSV文件存取 CSV文件 CSV(Comma-Separated Value,逗号分隔值)是一种常见的文件格式,用来存储批量数据. np.savet ...

  8. go 多维度 Map 的数据存取

    多维度 Map 的数据存取 一维情况下的 map 做存取很简单,而二维以上的情况就得小心了. 先来看一个例子: m:=make(map[string]map[string]int)   c:=make ...

  9. Pandas数据存取

    pd.read_excel('foo.xlsx', 'Sheet1', index_col=None, na_values=['NA']) Pandas数据存取 Pandas可以存取多种介质类型数据, ...

随机推荐

  1. Python Socket 网络编程 (服务器端编程)

    服务器端主要做以下工作: 打开 socket 绑定到特定的地址以及端口上 监听连接 建立连接 接收/发送数据 上面已经介绍了如何创建 socket 了,下面一步是绑定. 绑定 socket 函数 bi ...

  2. MDL原理理解

    转载自:http://blog.csdn.net/xiaoyu714543065/article/details/8445221 最小描述长度(MDL)        最小描述长度( MDL) 原理是 ...

  3. Android-ViewPagerIndicator框架使用——UnderlinePageIndicator

    前言:UnderlinePageIndicator这个指示,是一个很小巧的东西,简单,没有那么多复杂的效果. 一:布局定义simple_underlines: <LinearLayout xml ...

  4. Laravel5.1 模型 --一对一关系

    这篇文章主要记录模型的一对一关系,关联关系是Model的一种非常方便的功能. 1 实现一对一关系 1.1 准备工作 首先我们需要创建两张表和对应的两个模型,第一个模型是用户表,第二个模型是账号表. 这 ...

  5. 控制器post参数接收

    一.post对象 1.后台c# public class TestController : ApiController { [HttpPost] public string SaveData1(Tb_ ...

  6. ios应用,64位问题,Missing 64-bit support

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmFyb25fYmxvZ3M=/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  7. Android无线测试之—UiAutomator UiDevice API介绍四

    拖拽与滑动 一.概念介绍: 1)拖拽:将组建从一个坐标移动到另一个坐标 2)移动:从一二坐标点移动到另一个坐标点 3)步长:从一点滑动到另一点使用的时间 二.拖拽与滑动的相关API: 返回值 方法名 ...

  8. chm文件无法阅读

    当我们费劲千辛万苦从网上下载好chm文件资料后,打开后发现竟然是这个样子的: 其中主要原因是CHM文件被阻止显示了,CHM文件在NTFS格式的硬盘里的时候就会被阻止显示.我们返回我的电脑,点中我们存放 ...

  9. Convert.ToInt32(string '000000003') 变成了 3

    Convert.ToInt32(string '000000003') 变成了 3 但是在查询的时候需要用的是string 这里的convert.toint32 反而起了坏作用,不是所有的时候都要用c ...

  10. 《从零开始学Swift》学习笔记(Day 47)——final关键字

    原创文章,欢迎转载.转载请注明:关东升的博客 在类的定义中使用final关键字声明类.属性.方法和下标.final声明的类不能被继承,final声明的属性.方法和下标不能被重写. 下面看一个示例: f ...