iOS学习总结之沙盒和归档

来源:互联网 发布:配音朗读软件 编辑:程序博客网 时间:2024/05/21 06:31

 沙盒   归档                                                                                            

一、沙盒(sandbox)

1、iOS的沙盒(sandbox)机制:是一种安全体系 iOS应用程序只能对自己创建的应用程序进行读取文件 这个独立、封闭、安全的空间 就是沙盒。它里面一般存放着你的程序需要的文件 数据持久化的一些文件(Plist、sqlite...)音视频、图片以及其他资源文件

2、每一个应用程序只有一个沙盒。沙盒里面有三个文件夹

1>Documents

特点:目录下的内容 会被同步到另一台设备 可以放 媒体资源 文本资源

2>Librery

特点:可以把缓存的内容放到Library/Caches

3>tmp

特点:创建临时文件的目录 当我们的设备重启时 文件会被自动清除

3、获取沙盒文件的方式

1>获得根目录的方式

    NSString *homePath = NSHomeDirectory();

    NSLog(@"%@", homePath);

2>获得 Document 的方式

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    NSString *DocumentPath = [paths firstObject];

    NSLog(@"%@", DocumentPath);

 3>获得Library 的方式

    NSArray *pathL = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);

    NSString *LibraryPath = [pathL lastObject];

    NSLog(@"%@", LibraryPath);

4>获得Library/Caches 的方式

    NSArray *pathCh = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);

    NSString *CachesPath = [pathCh firstObject];

    NSLog(@"%@", CachesPath);

5>获得 tmp 的方式

    NSString *tmpPath = NSTemporaryDirectory();

    NSLog(@"%@", tmpPath);

二、归档

1、归档 NSKeyedArchiver 解文挡 NSKeyedUnarchiver

2、归档又叫序列化 coding。

3、归档之后的文件会被加密。

4、可以归档的文件、数据:任何数据(直接归档一个类实例化的对象 数组 字典 字符串 文本 图片…)。


5、使用 NSKeyedArchiver 归档

1>归档路径 需要归档的数据

2>归档、解归档

1>(1)归档在哪个文件

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    NSString *documentPath = [paths lastObject];

 1>(2)拼接归档文件的路径

    NSString *path = [documentPath stringByAppendingPathComponent:@“userList.archiver"];

1>(3)归档数据

 NSArray *users = @[@"外星人", @"喵喵", @"汪汪"];

    BOOL success = [NSKeyedArchiver archiveRootObject:users toFile:path];//users 归档数据 path 归档路径

 if (success) {

      NSLog(@“归档成功”);

    }

6、使用 NSKeyedUnarchiver 解归档

1>解归档的文件路径

2>解归档

1>(1)解归档的文件路径

NSArray *pathU = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    NSString *pathU1 = [[pathU lastObject] stringByAppendingPathComponent:@“userList.archiver"];

1>(2)解归档

  NSArray *list = [NSKeyedUnarchiver unarchiveObjectWithFile:pathU1];

 //遍历归档里面的数据

        for (NSString *name in list) {

            NSLog(@"%@", name);

        }

//添加新的元素 

   NSMutableArray *arr = [list mutableCopy];

   [arr addObject:@“星星"];

7、使用NAData归档

NSData 二进制数据的类

1>归档文件路径 准备需要归档的数据

2>写一个可变NSMutableData 通过归档的类 让Data 准备写入文件

3>开始(归档)编码

4>结束(归档)编码 把Data数据写入到文件


1>归档文件路径 准备需要归档的数据

  NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 

    //    拼接归档文件的路径

    NSString *path = [[paths lastObject] stringByAppendingPathComponent:@"userList1.archiver"];

    //    归档数据

    NSArray *list = @[@"111", @"222", @"333"];

    NSDictionary *dic = @{@“key":@"value"};

2>写一个可变NSMutableData  通过归档的类 让Data 准备写入到文件

    NSMutableData *data = [NSMutableData data];

    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];

 3>开始(归档)编码(编码的key 和 解码时候的key 一定要同一)

    [archiver encodeObject:list forKey:@"list"];

    [archiver encodeObject:dic forKey:@"dic"];

4>结束(归档)编码  把data数据写入到文件

    [archiver finishEncoding];

//   atomically 如果设置成YES 的时候 在写入数据时 如果出现意外情况(用户突然强制退出了应用程序、断电...)会把写入到临时文件的内容清掉 不再写入到目标文件

//    atomically 如果设置成NO 不管数据是否完整 都会直接写入到目标文件

   BOOL success = [data writeToFile:path atomically:YES];

    //检测是否归档成功

    if (success) {

     NSLog(@“归档成功”);

    }

8、  解归档

  1>文件路径

  2>读取文件里面data数据

 3>通过解归档对象 读取data数据 准备解归档

  4>解归档数据


1>文件路径

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

  拼接归档文件的路径

    NSString *path = [[paths lastObject] stringByAppendingPathComponent:@"userList1.archiver"];

  2>读取文件里面data数据

    NSData *data = [NSData dataWithContentsOfFile:path];

  3>通过解归档对象 读取data数据 准备解归档

    NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];

 4>解归档数据(解码)

   NSArray *arr = [unArchiver decodeObjectForKey:@"list"];

    NSDictionary *dic = [unArchiver decodeObjectForKey:@"dic"];

    //输出解归档的数据

     NSLog(@"%@\n%@", arr, dic);

9、归档自定义类的对象

1、想归档自定义类的对象

1>遵守NSCoding协议 





2>实现归档协议里面的方法

3>逐一对 自定义类里面的属性 进行了 编码和解码

//对UserModel(自定义类)对象里面 每一个属性进行编码

- (void)encodeWithCoder:(NSCoder *)aCoder{

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

    [aCoder encodeInteger:self.age forKey:@"age"];

}




//对UserModel对象 进行解码

- (id)initWithCoder:(NSCoder *)aDecoder{

        if (self = [super init]) {

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

            self.age = [aDecoder decodeIntegerForKey:@"age"];

        }

        return self;

}


4>开始归档 解归档


2、归档

1>准备要归档的路径 要归档的数据

2>进行归档


1>准备要归档的路径 要归档的数据

1>准备要归档文件的路径

   NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    NSString *path = [[paths lastObject] stringByAppendingPathComponent:@"UserModel.archiver"];

    要归档的数据

    UserModel *model = [[UserModel alloc]init];

    model.name = @"小明";

    model.age = 21;

    

 2>进行归档

    BOOL success = [NSKeyedArchiver archiveRootObject:(id) model toFile:(NSString *)path];

    if (success) {

       NSLog(@“归档成功”);

    }    

3、 解归档

  1>文件路径

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    NSString *path = [[paths lastObject] stringByAppendingPathComponent:@"UserModel.archiver"];

  2>解归档

    UserModel *model = [NSKeyedUnarchiver unarchiveObjectWithFile:path];

     NSLog(@"%@ %ld", model.name, (long)model.age);


0 0
原创粉丝点击