目录:

一、沙盒机制

二、用户偏好设置

三、归档

一、沙盒机制

每个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. HDU 3080 The plan of city rebuild(除点最小生成树)

    题意  一个城市原来有l个村庄 e1条道路  又添加了n个村庄 e2条道路  后来后销毁了m个村庄  与m相连的道路也销毁了  求使全部未销毁村庄相互连通最小花费  不能连通输出what a pity ...

  2. Android Otto框架浅析

    今天要介绍的是一个Android中使用得比較多的android 事件总线 EventBus模式的一个框架Otto. Otto 官网:http://square.github.io/otto/ 一.An ...

  3. SlidingMenu官方实例分析8——CustomAnimation

    CustomAnimation 构造方法: 其中CanvasTransformer对象是重点,因为他是实现动画的对象,设置对象的代码如下: 其中变化方法如下: 其中的canvas.scale(),方法 ...

  4. iframe详解

    如何查看是否为iframe *使用FireFox组件firebug->firepath 1.Top Window:可直接定位 2.iframe#i:根据id定位 定位方法: switch_to. ...

  5. SpringAOP和AspectJ

    SpringAOP和AspectJ的关系 问题:之前对 SpringAOP和AspectJ的关系感到疑惑,因为曾经在书上看过SpringAOP集成了AspectJ,那么SpringAOP是直接使用了A ...

  6. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)2.1——设置项目参数

    问题: 开发的时候经常需要向项目中添加一些额外的参数或者硬编码的值. 解决方案: 使用ext块设置公用的值.如果需要从build文件中移除这些值,可以将参数放到gradle.properties文件中 ...

  7. 部署网站时的错误“one of its dependencies.试图加载格式不正确的程序。”解决方案。

    Sever Error in '/' Application.Could not load file or assembly 'SresBase' or one of its dependencies ...

  8. 【BZOJ1880】[Sdoi2009]Elaxia的路线 最短路+DP

    [BZOJ1880][Sdoi2009]Elaxia的路线 Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起 ...

  9. SharePoint让所有用户访问站点

    SharePoint让所有用户访问站点,可用在用户组里面添加:NT AUTHORITY\authenticated users

  10. SharePoint服务器端对象模型 之 序言

    对于刚刚开始接触SharePoint的开发人员,即使之前有较为丰富的ASP.NET开发经验,在面对SharePoint时候可能也很难找到入手的方向.对于任何一种开发平台而言,学习开发的过程大致会包括: ...