美文网首页
沙盒存储操作

沙盒存储操作

作者: 一个默默无闻的程序猿 | 来源:发表于2018-03-05 15:10 被阅读0次

    //  沙盒存储操作

    /**每个iOS程序都有自己的文件系统目录,就是沙盒,并且与其他文件系统、其他应用程序隔离,并且其他应用不能访问该沙盒。

        沙盒下的目录如下:

    1、Application:存放程序源文件,上架前经过数字签名,上架后不可修改。

    2、Documents:保存应用程序运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录。例如,游戏应用可将游戏存档保存在该目录。

    3、tmp:保存应用程序运行时所需要的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。iTunes同步时不会备份该目录。

    4、Library/Caches:保存应用程序运行时生成需要持久化的数据,iTunes同步设备时不会备份该目录。一般存储体积大、不需要备份的重要数据,比如网络数据缓存存储到Caches下。

    5、Library/Preference:保存应用的所有偏好设置,如iOS的Settings(设置)应用会在该目录中查找应用的设置信息。iTunes同步设备时会备份该目录。

    */

    #import "ViewController.h"

    #import "EncodeAndDecode.h"

    @interface ViewController ()

    @end

    @implementation ViewController

    - (void)viewDidLoad {

        [super viewDidLoad];

    一、属性列表plist存储

        /**

        plist只能存储是写入到Documents目录下且只能是系统自带的一些常规的类,也就是有writeToFile方法的对象才可以使用plist保存数据

        字符串/字典/数据/NSNumber/NSData ...

        自定义的对象不能保存到plist中。

        */

        //1、保存

        NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];

        // NSUserDomainMask 在用户目录下查找

        // YES 代表展开用户目录的~

        // NSDocumentDirectory 查找Documents文件夹

        //拼接文件路径

        NSString *path = [doc stringByAppendingString:@"/adc.plist"];

        NSLog(@"%@",path);

        NSDictionary *dictionary= @{@"name":@"abc"};

        [dictionary writeToFile:path atomically:YES];

        //读取

        NSDictionary *readDic = [NSDictionary dictionaryWithContentsOfFile:path];

        NSLog(@"%@",readDic);

    二、偏好设置

        //偏好设置在library目录下的preference中

        //偏好设置是专门用来保存应用程序的配置信息的不如保存用户名、密码、字体大小等设置,一般情况不要在偏好设置中保存其他数据

        //偏好设置会将所有的数据保存到同一个文件中

        //1、写入

        NSUserDefaults *defults = [NSUserDefaults standardUserDefaults];

        [defults setObject:@"abc" forKey:@"userName"];

        [defults setObject:@"123" forKey:@"key"];

        //让NSUserDefaults立刻保存数据 注意:NSUserDefaults设置数据时,不要立即写入,而是要根据时间戳定时地把缓存中的数据写入本地磁盘。

        //所以调用set方法之后数据有可能还没有写入磁盘应用程序就终止了。出现以上问题,可以通过调用 synchronize 方法强制写入

        [defults synchronize];//如果立刻保存就需要执行这段代码

        //2、读取

        NSString *name = [defults objectForKey:@"userName"];

        NSString *passWord = [defults objectForKey:@"key"];

        NSLog(@"用户名:%@\n密码:%@",name,passWord);

    三、归档

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

        不是所有的对象都可以直接用这种方法进行归档,只有遵守了NSCoding协议的对象才可以

        NSCoding协议有2个方法:

        encodeWithCoder:

        每次归档对象时,都会调用这个方法。一帮在这个方法里面指定如何归档对象中的每个实例变量,可以使用encodeObject:forKey:方法归档实例变量

        initWithCoder:

        每次从文件中恢复(解档)对象时,都会调用这个方法。一般在这个方法里面制定如何解档文件中的数据为对象的实例变量,可以使用decodeObject:forKey方法解档实例变量

        */

        //1、归档

        //创建对象

        EncodeAndDecode *obj = [[EncodeAndDecode alloc]init];

        obj.name = @"affas";

        obj.passWord = @"3324123";

        //获取文件路径

        NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES)lastObject];

        //拼接文件路径

        NSString *encodePath = [docPath stringByAppendingString:@"/stu.xxoo"];

        [NSKeyedArchiver archiveRootObject:obj toFile:encodePath];

        EncodeAndDecode *decodeObj = [NSKeyedUnarchiver unarchiveObjectWithFile:encodePath];

        NSLog(@"解档之后\nname:%@\npassWord:%@",decodeObj.name,decodeObj.passWord);

    //四、沙盒目录

        //1、程序的Home目录

        /**

                       |--------MyApp.app

        home---|--------Documents

                       |--------Library

                      |--------tmp

        */

        /**

        MyApp.app

        ①存放内容

        该目录包含了应用程序本身的数据,包括资源文件和可执行文件等。程序启动以后,会根据需要从该目录中动态加载代码或资源到内存,这里用到了lazy loading的思想。

        ②整个目录是只读的

        为了防止被篡改,应用在安装的时候会将该目录签名。非越狱情况下,该目录中内容是无法更改的;在越狱设备上如果更改了目录内容,对应的签名就会被改变,这种情况下苹果官网描述的后果是应用程序将无法启动,我没实践过。

        ③是否会被iTunes同步

        否

        */

        NSString *homePath = NSHomeDirectory();

        NSLog(@"程序home目录:%@",homePath);

        /**打印结果

        /var/mobile/Containers/Data/Application/F37B7D9C-9E11-4CE2-B47E-882D296417F0

        */

        //2、Documents目录

        /**

        Documents

        ①存放内容

        我们可以将应用程序的数据文件保存在该目录下。不过这些数据类型仅限于不可再生的数据,可再生的数据文件应该存放在Library/Cache目录下。

        ②是否会被iTunes同步:是

        Documents/Inbox

        ①存放内容

        该目录用来保存由外部应用请求当前应用程序打开的文件。

        比如我们的应用叫A,向系统注册了几种可打开的文件格式,B应用有一个A支持的格式的文件F,并且申请调用A打开F。由于F当前是在B应用的沙盒中,我们知道,沙盒机制是不允许A访问B沙盒中的文件,因此苹果的解决方案是讲F拷贝一份到A应用的Documents/Inbox目录下,再让A打开F。

        ②是否会被iTunes同步

        是

        */

        NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];

        NSLog(@"程序Documents目录:%@",documentPath);

        /**打印结果

        /var/mobile/Containers/Data/Application/B56CC9BE-8953-4213-AF31-27859319DFC5/Documents

        */

       //3、tmp目录

        /**

        ①存放内容

        各种临时文件,保存应用再次启动时不需要的文件。而且,当应用不再需要这些文件时应该主动将其删除,因为该目录下的东西随时有可能被系统清理掉,目前已知的一种可能清理的原因是系统磁盘存储空间不足的时候。

        ②是否会被iTunes同步

        否

        */

        NSString *tmpPath = NSTemporaryDirectory();

        NSLog(@"程序tmp目录:%@",tmpPath);

        /**打印结果

        /private/var/mobile/Containers/Data/Application/D0729DDE-C8BF-4699-9B6F-1CFBC7D38257/tmp/

        */

        //4、Library目录

        /**

        ①存放内容

        苹果建议用来存放默认设置或其它状态信息。

        ②是否会被iTunes同步

        是,但是要除了Caches子目录外

        */

        /**

        Library/Preferences

        ①存放内容

        应用程序的偏好设置文件。我们使用NSUserDefaults写的设置数据都会保存到该目录下的一个plist文件中,这就是所谓的写道plist中!

        ②是否会被iTunes同步

        是

        */

        NSString *libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES)lastObject];

        NSLog(@"程序Library目录:%@",libraryPath);

        /**打印结果

        /var/mobile/Containers/Data/Application/23477FDF-68CE-4C42-9D1F-3BD5A7BF76C8/Library

        */

        //5、cache目录

        /**

        ①存放内容

        主要是缓存文件,用户使用过程中缓存都可以保存在这个目录中。前面说过,Documents目录用于保存不可再生的文件,那么这个目录就用于保存那些可再生的文件,比如网络请求的数据。鉴于此,应用程序通常还需要负责删除这些文件。

        ②是否会被iTunes同步

        否。

        */

        NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject];

        NSLog(@"程序Caches目录:%@",cachePath);

        /**打印结果

        /var/mobile/Containers/Data/Application/F9A63466-BA79-4291-9C03-92001BC3EFA7/Library/Caches

        */

        //6、写文件

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

        for (NSInteger i = 0; i < searchPaths.count; i ++) {

            NSString *p = searchPaths[i];

            NSLog(@"[%ld]%@",i,p);

            /**打印结果

            [0]/var/mobile/Containers/Data/Application/B75A8AF9-49BF-4144-8DC9-59554D09292C/Documents

            */

        }

        NSString *writePath = [searchPaths[0] stringByAppendingString:@"/aa.text"];

        NSArray *arr = [NSArray arrayWithObjects:@"文本:",@"text", nil];

        [arr writeToFile:writePath atomically:YES];

        //7、读取文件

        NSArray *readFile = [[NSArray alloc]initWithContentsOfFile:writePath];

        NSLog(@"%@",readFile);

    }

    - (void)didReceiveMemoryWarning {

        [super didReceiveMemoryWarning];

        // Dispose of any resources that can be recreated.

    }

    @end

    相关文章

      网友评论

          本文标题:沙盒存储操作

          本文链接:https://www.haomeiwen.com/subject/opjhfftx.html