初级沙盒机制

沙盒组成

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

Document: 存储用户数据,需要备份的信息。
Library/Caches: 存储缓存文件,程序专用的支持文件
Library/Preferences: 存储应用程序的偏好设置文件
.app: 程序包(IOS8时,app不存储在沙盒中,有单独的文件夹存储所有程序的app包)
tem: 存储临时文件。比如:下载的zip包,解压后的再删除。

获取沙盒目录路径的方法

NSHomeDirectory—————->沙盒主路径
NSDocumentDirectory————>Documents文件夹
NSLibraryDirectory————->Library文件夹
NSCachesDirectory————–>Caches文件夹
NSTemporaryDirectory———–>tmp文件夹

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

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

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

//    2.数组对象写入文件
//    构建数组plist文件的存储路径
    NSString *arrPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingString:@"arr.txt"];
//    构建数组对象
    NSArray *arr = @[@"哈哈",@"呵呵",@"哈呵呵",@"呵哈哈"];
//    将数组添加到文件--为什么写YES?查API
    [arr writeToFile:arrPath atomically:YES];

//    3.字典对象写入文件
//    构造字典plist文件的存储路径
    NSString *dicPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingString:@"/dic.txt"];
//    创建字典对象
    NSDictionary *dic = @{@"name": @"张三",@"age": @"10",@"sex": @"男"};
//    将字典对象存储到文件内
    [dic writeToFile:dicPath atomically:YES];

//    4.二进制对象写入文件
    NSString *dataPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingString:@"/data.png"];
//    创建data对象
    UIImage *image = [UIImage imageNamed:@"fashi1.png"];
//    将图片转化成二进制数据
    NSData *data = UIImagePNGRepresentation(image);
    [data writeToFile:dataPath atomically:YES];

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

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

拷贝和移动原理:如果从A文件夹中的a文件内容拷贝到到B文件,则需要先在B文件先手动创建一个承接a文件的b文件,然后再将a文件的内容拷贝到b文件中。移动原理类似,将a文件里边的内容拷贝到b文件中,然后再将a文件移除,很没意思。。。

//    创建NSFileManager对象
    NSFileManager *manager = [NSFileManager defaultManager];
//    获取开始发出文件的路径,并准备创建一个start文件夹
    NSString *startPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingString:@"/start"];
//    用manager方法创建文件夹
    [manager createDirectoryAtPath:startPath withIntermediateDirectories:YES attributes:nil error:nil];
//    在文件夹中创建start.txt文件
    NSString *sourcePath = [startPath stringByAppendingString:@"/start.txt"];
//    文件内输入内容输入内容
    NSString *str = @"mini";
//    写入内容
    [str writeToFile:sourcePath atomically:YES encoding:NSUTF8StringEncoding error:nil];
//    获取最后接收文件的路径,并准备创建一个end文件夹来接收文件
    NSString *endPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingString:@"/end"];
//    创建文件夹
    [manager createDirectoryAtPath:endPath withIntermediateDirectories:YES attributes:nil error:nil];
//    在end文件夹中创建一个空的end.txt文件,用来接收start.txt的内容,并获取文件路径
    NSString *destPath = [endPath stringByAppendingString:@"/end.txt"];
    NSLog(@"%@",sourcePath);
//    准备接收错误信息
    NSError *error = nil;
//    完成拷贝过程
    [manager copyItemAtPath:sourcePath toPath:destPath error:&error];
//    完成移动过程
    [manager moveItemAtPath:sourcePath toPath:destPath error:&error];

复杂对象是没有writeToFile方法的,所有不能直接写入文件,解决这一问题的思路是:
将复杂的对象转化成简单对象,然后调用简单对象的writeToFile方法实现持久化。

NSKeyedArchiver: 归档类,主要功能是将对象转化成二进制数据(NSData)。
NSKeyedUnarchiver:反归档类,主要功能是将二进制数据(NSData)还原成对象。
被归档的对象,必须遵循NSCoding协议,实现里面的方法。

#import <Foundation/Foundation.h>

//要归档的对象,必须遵循NSCoding协议
@interface User : NSObject<NSCoding>

@property (nonatomic,copy) NSString *name;
@property (nonatomic,copy) NSString *pwd;
@property (nonatomic,assign) int status;

@end

#import "User.h"

@implementation User


//代理方法,在归档方法中作用于_delegate实例变量,方法对外提供的赋值的接口
- (void)encodeWithCoder:(NSCoder *)aCoder {

    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeObject:self.pwd forKey:@"pwd"];
    [aCoder encodeInt:self.status forKey:@"status"];

}

//反归档时调用此方法,将数据重新赋给对象
- (id)initWithCoder:(NSCoder *)aDecoder {

    self = [super init];
    if (self) {
        self.name = [aDecoder decodeObjectForKey:@"name"];
        self.pwd = [aDecoder decodeObjectForKey:@"pwd"];
        self.status = [aDecoder decodeIntForKey:@"status"];
    }
    return self;
}

- (void)dealloc {
    [_name release];
    [_pwd release];
    [super dealloc];
}

@end

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

//    归档的基本实现步骤
//    1.创建空MutableData对象用于接收归档数据
    NSMutableData *mulData = [NSMutableData data];
//    2.利用空的mulData创建一个归档类对象,用于接收数据
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:mulData];
//    3.利用归档方法进行归档,并对归档数据做标记
    [archiver encodeObject:user forKey:@"user"];
//    结束归档
    [archiver finishEncoding];
    NSLog(@"%@",mulData);

//    反归档步骤
//    1.利用存有数据的mulData创建反归档对象unarchiver
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:mulData];
//    2.利用反归档方法通过标记将mulData中的数据写入receiveUser
    User *receiveUser = [unarchiver decodeObjectForKey:@"user"];
//    3.输出数据
    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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值