初级沙盒机制

沙盒组成

注意:如果创建的.txt等文件中没有任何数据,将不会显示

Document:存储用户数据,需要备份的信息。

Library/Caches:存储缓存文件,程序专用的支持文件

Library/Preferences:存储应用程序的偏好设置文件

.app :程序包(IOS8时,app不存储在沙盒中,有单独的文件夹存储所有程序的app包)

tem:存储临时文件。比如:下载的zip包,解压后的再删除。

---------------------------------------------------------------

获取沙盒目录路径的方法

NSHomeDirectory---------------->沙盒主路径

NSDocumentDirectory------------>Documents文件夹

NSLibraryDirectory---------------->Library文件夹

NSCachesDirectory---------------->Caches文件夹

NSTemporaryDirectory------------>tmp文件夹

----------------------------------------------------------------

简单示例-----向document中添加字符串文件并取出

 1 //   1.字符串文件的存储路径
 2 //    获取所有的documents文件夹---如果里边的三个量填写错误,会造成路径为空
 3     NSArray *docArr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
 4 //    将最后的document文件夹路径作为文件的存储目录
 5     NSString *docPath = docArr.lastObject;
 6 //    构造字符串文件的存储路径
 7     NSString *strPath = [docPath stringByAppendingPathComponent:@"text.txt"];
 8 //    构造字符串对象
 9     NSString *str = @"this is a test";
10 //    通过将writeToFile:atomitically:encoding:error:方法发送给字符串对象完成字符串存储到文件内的功能 NSUTF8StringEncoding编码方式能输入汉字
11     [str writeToFile:strPath atomically:YES encoding:NSUTF8StringEncoding error:nil];
12 //    从沙盒中取出字符串
13     NSString *strOut = [NSString stringWithContentsOfFile:strPath encoding:NSUTF8StringEncoding error:nil];
14     NSLog(@"%@",strOut);

同理可以将数组,字典,二进制对象写入文件,完成文件的永久存储

 1 //    2.数组对象写入文件
 2 //    构建数组plist文件的存储路径
 3     NSString *arrPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingString:@"arr.txt"];
 4 //    构建数组对象
 5     NSArray *arr = @[@"哈哈",@"呵呵",@"哈呵呵",@"呵哈哈"];
 6 //    将数组添加到文件--为什么写YES?查API
 7     [arr writeToFile:arrPath atomically:YES];
 8
 9 //    3.字典对象写入文件
10 //    构造字典plist文件的存储路径
11     NSString *dicPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingString:@"/dic.txt"];
12 //    创建字典对象
13     NSDictionary *dic = @{@"name": @"张三",@"age": @"10",@"sex": @"男"};
14 //    将字典对象存储到文件内
15     [dic writeToFile:dicPath atomically:YES];
16
17 //    4.二进制对象写入文件
18     NSString *dataPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingString:@"/data.png"];
19 //    创建data对象
20     UIImage *image = [UIImage imageNamed:@"fashi1.png"];
21 //    将图片转化成二进制数据
22     NSData *data = UIImagePNGRepresentation(image);
23     [data writeToFile:dataPath atomically:YES];

在添加文件时有时候需要中间添加文件夹,NSFileManager类可以帮助我们完成这项功能

 1 //    通过NSFileManager可以实现文件夹的添加
 2 //    defaultManager表示是一个单例
 3     NSFileManager *manager = [NSFileManager defaultManager];
 4 //    构造文件存储路径创建了三个文件夹,必须向文件夹中添加数据才能显示
 5 //    NSString *dirPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingString:@"/aa/bb/dic.txt"];
 6     NSString *dirPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingString:@"/aa/bb"];
 7 //     创建文件路径,当withIntermediateDirectories为YES时创建中间文件夹,NO是不创建中间文件夹
 8     [manager createDirectoryAtPath:dirPath withIntermediateDirectories:YES attributes:nil error:nil];
 9 //    添加了两个文件夹,然后再在bb文件夹中添加文件
10     NSString *str1Path = [dirPath stringByAppendingString:@"/haha.txt"];
11 //    向文件中添加内容,进行文件创建,不添加内容没有文件显示
12     NSString *a = @"你好吗,吃了吗?";
13     [a writeToFile:str1Path atomically:YES encoding:NSUTF8StringEncoding error:nil];

文件的拷贝和移动就没有什么意思了。。。

拷贝和移动原理:如果从A文件夹中的a文件内容拷贝到到B文件,则需要先在B文件先手动创建一个承接

a文件的b文件,然后再将a文件的内容拷贝到b文件中。移动原理类似,将a文件里边的内容拷贝到b文件中

,然后再将a文件移除,很没意思。。

 1 //    创建NSFileManager对象
 2     NSFileManager *manager = [NSFileManager defaultManager];
 3 //    获取开始发出文件的路径,并准备创建一个start文件夹
 4     NSString *startPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingString:@"/start"];
 5 //    用manager方法创建文件夹
 6     [manager createDirectoryAtPath:startPath withIntermediateDirectories:YES attributes:nil error:nil];
 7 //    在文件夹中创建start.txt文件
 8     NSString *sourcePath = [startPath stringByAppendingString:@"/start.txt"];
 9 //    文件内输入内容输入内容
10     NSString *str = @"mini";
11 //    写入内容
12     [str writeToFile:sourcePath atomically:YES encoding:NSUTF8StringEncoding error:nil];
13 //    获取最后接收文件的路径,并准备创建一个end文件夹来接收文件
14     NSString *endPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingString:@"/end"];
15 //    创建文件夹
16     [manager createDirectoryAtPath:endPath withIntermediateDirectories:YES attributes:nil error:nil];
17 //    在end文件夹中创建一个空的end.txt文件,用来接收start.txt的内容,并获取文件路径
18     NSString *destPath = [endPath stringByAppendingString:@"/end.txt"];
19     NSLog(@"%@",sourcePath);
20 //    准备接收错误信息
21     NSError *error = nil;
22 //    完成拷贝过程
23     [manager copyItemAtPath:sourcePath toPath:destPath error:&error];
24 //    完成移动过程
25     [manager moveItemAtPath:sourcePath toPath:destPath error:&error];

复杂对象写入文件持久保存

复杂对象是没有writeToFile方法的,所有不能直接写入文件,解决这一问题的思路是:

将复杂的对象转化成简单对象,然后调用简单对象的writeToFile方法实现持久化。

NSKeyedArchiver:归档类,主要功能是将对象转化成二进制数据(NSData)。

NSKeyedUnarchiver:反归档类,主要功能是将二进制数据(NSData)还原成对象。

被归档的对象,必须遵循NSCoding协议,实现里面的方法。

 1 #import <Foundation/Foundation.h>
 2
 3 //要归档的对象,必须遵循NSCoding协议
 4 @interface User : NSObject<NSCoding>
 5
 6 @property (nonatomic,copy) NSString *name;
 7 @property (nonatomic,copy) NSString *pwd;
 8 @property (nonatomic,assign) int status;
 9
10 @end
11
12 #import "User.h"
13
14 @implementation User
15
16
17 //代理方法,在归档方法中作用于_delegate实例变量,方法对外提供的赋值的接口
18 - (void)encodeWithCoder:(NSCoder *)aCoder {
19
20     [aCoder encodeObject:self.name forKey:@"name"];
21     [aCoder encodeObject:self.pwd forKey:@"pwd"];
22     [aCoder encodeInt:self.status forKey:@"status"];
23
24 }
25
26 //反归档时调用此方法,将数据重新赋给对象
27 - (id)initWithCoder:(NSCoder *)aDecoder {
28
29     self = [super init];
30     if (self) {
31         self.name = [aDecoder decodeObjectForKey:@"name"];
32         self.pwd = [aDecoder decodeObjectForKey:@"pwd"];
33         self.status = [aDecoder decodeIntForKey:@"status"];
34     }
35     return self;
36 }
37
38 - (void)dealloc {
39     [_name release];
40     [_pwd release];
41     [super dealloc];
42 }
43
44 @end

归档与反归档的内部实现细节

 1 //    归档的基本实现步骤
 2 //    1.创建空MutableData对象用于接收归档数据
 3     NSMutableData *mulData = [NSMutableData data];
 4 //    2.利用空的mulData创建一个归档类对象,用于接收数据
 5     NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:mulData];
 6 //    3.利用归档方法进行归档,并对归档数据做标记
 7     [archiver encodeObject:user forKey:@"user"];
 8 //    结束归档
 9     [archiver finishEncoding];
10     NSLog(@"%@",mulData);
11
12 //    反归档步骤
13 //    1.利用存有数据的mulData创建反归档对象unarchiver
14     NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:mulData];
15 //    2.利用反归档方法通过标记将mulData中的数据写入receiveUser
16     User *receiveUser = [unarchiver decodeObjectForKey:@"user"];
17 //    3.输出数据
18     NSLog(@"%@ %@",receiveUser.name,receiveUser.pwd);

归档与反归档平常使用方法---直接将对象归档到文件中

//    归档与反归档的平常使用方法:直接将数据归档到文件中
    User *user = [[User alloc] init];
    user.name = @"张三";
    user.pwd = @"13412";

//    获取文件路径,并创建一个archiver文件
    NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingString:@"/archiver.txt"];
//    直接将将对象归档到文件中,直接使用类方法
    [NSKeyedArchiver archiveRootObject:user toFile:filePath];
//    直接使用反归档类方法将文件取出来
    User *testUser = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
//    输出
    NSLog(@"%@ %@",testUser.name,testUser.pwd);
时间: 2024-10-13 07:44:33

初级沙盒机制的相关文章

IOS 阶段学习第25天笔记(IOS沙盒机制介绍)

IOS学习(OC语言)知识点整理 一.IOS沙盒机制介绍 1)概念:每个ios应用都有自己的应用沙盒,应用沙盒就是文件系统目录,与其他应用放入文件 系统隔离,ios系统不允许访问 其他应用的应用沙盒,但在ios8中已经开放访问(extension) 2)extension是ios8新开放的一种对几个固定系统区域的拓展机制,它可以在一定程度上弥补ios的沙盒机制对应用间的通信限制 3)应用沙盒一般包括以下几个文件目录: 1.应用程序包:包含所有资源文件和可执行文件 2.Documents:保存应用

iOS之沙盒机制

今天有讲到数据持久化的问题,就有涉及到数据存储位置的问题.iOS对于数据安全问题做的很严谨,使用的沙盒机制(Sandbox),相对于安卓系统而言,一下子真的是难以消化. 在iOS8之前的沙盒文件夹中存在四个文件夹 Document  存储用户数据,需要备份的信息(数据持久化操作的文件夹) Library Library/Caches  存储缓存文件,程序专用的支持文件 Library/Preferences  存储应用程序的偏好设置文件 .app   程序包(iOS8时,app不存储在沙盒中,有

【学习ios之路:UI系列】iOS沙盒机制,文件读取,归档与反归档

1.IOS中的沙盒机制 IOS中的沙盒机制是一种安全体系,它规定了应用程序只能在为该应用创建的文件夹内读取文件,不可以访问其他地方的内容.所有的非代码文件都保存在这个地方,比如图片.声音.属性列表和文本文件等. 特点: 1.每个应用程序都在自己的沙盒内 2.不能随意跨越自己的沙盒去访问别的应用程序沙盒的内容 3.应用程序向外请求或接收数据都需要经过权限认证 每个沙盒含有3个文件夹:Documents, Library 和 tmp.Library包含Caches.Preferences目录.如下图

IOS-沙盒机制(一 简述)

一 IOS沙盒机制 出于安全的目的,应用程序只能将自己的数据和偏好设置写入到几个特定的位置上.当应用程序被安装到设备上时,系统会为其创建一个家目录,这个家目录就是应用程序的沙盒.所以的文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等.(For security reasons, iOS places each app (including its preferences and data) in a sandbox at install time. A sandbox is a

IOS-沙盒机制(二 文件读写)

一 目录说明 如下图所示,一个沙盒中典型存在下面的目录和文件 各个目录及文件说明: 1.Documents      您应该将所有的应用程序数据文件写入到这个目录下,这个目录用于存储用户数据或其它应该定期备份的信息. 2.AppName.app   这是应用程序的程序包目录,包含应用程序的本身.由于应用程序必须经过签名,所以您在运行时不能对这个目录中的内容进行修改,否则可能会使应用程序无法启动. 3.Library              这个目录下有两个子目录:Caches 和 Prefer

IOS 沙盒机制 浅析

IOS中的沙盒机制(SandBox)是一种安全体系,它规定了应用程序只能在为该应用创建的文件夹内读取文件,不可以访问其他地方的内容.所有的非代码文件都保存在这个地方,比如图片.声音.属性列表和文本文件等. 1.每个应用程序都在自己的沙盒内(提示:在IOS8中已经开放访问) 2.不能随意跨越自己的沙盒去访问别的应用程序沙盒的内容 3.应用程序向外请求或接收数据都需要经过权限认证 //获取home目录 NSString *homePath = NSHomeDirectory(); NSLog(@"h

iOS的沙盒机制

数据持久化:就是把数据从内存中写入到本地(对于iOS开发来说,就是把数据写入到应用的沙盒文件夹在中). 沙盒(SandBox):沙盒的本质就是文件夹,iOS采用沙盒机制来管理每一个安装到手机上的应用,每一个应用都有一个沙盒,而且这个沙盒相对独立,封闭的,安全的,通常情况下只有自己才能访问自己. 沙盒安全机制:沙盒的文件是随机生成的,而且每次都会生成一个沙盒的文件名,且采用十六进制数字命名法. #import "ViewController.h" #define kName @"

ios 沙盒机制

1.IOS沙盒机制 在ios系统中,系统都为每一个app创建一个资源目录,这个目录称之为沙盒 .里面存放着图片,属性文件plist,bundle,nib文件等. 其特点如下: 1.每个应用都有属于自己的存储空间 -- 沙盒. 2.每个应用都只能访问自己的沙盒,不能访问别的沙盒 3.每个应用的文件操作必须在沙盒内,比如数据库存储,文件存储等 2.沙盒目录结构 Documents 应用中用户数据可以放在这里,iTunes备份和恢复的时候会包括此目录 --- Caches 存储应用程序再次启动所需的信

UI 沙盒机制 文件的读写操作

沙盒机制: 数据持久化的本质:将数据读成文件,存储在本地 沙盒机制:沙盒就是系统针对于每个应用程序在本地生成的文件夹(名字随机生成).对于不同的应用程序,不能访问其他应用程序沙盒内的内容.对于该应用内容起到保护作用. 沙盒内的文件夹: (1)Documents:用来存储长久保存的数据 (2)XXX.app: 应用程序的包,包含应用程序加载所需的所有资源,(readonly 只读,不可修改).平时使用的NSBundle就是该包. (3)Library: A: Caches:本地缓存,存储想暂时保存