zoukankan      html  css  js  c++  java
  • iOS:沙盒、偏好设置、归档、解归档

    一、沙盒和应用程序包

    •iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被称为沙盒

    •iOS常用目录:
    –Bundle
    –Documents
    –Library/Caches
    –Library/Preference
    –tmp
    显示mac隐藏文件:defaults write com.apple.finder AppleShowAllFiles -bool true
    隐藏mac隐藏文件:defaults write com.apple.finder AppleShowAllFiles -bool false
     

    应用程序包路径:资源库/Developer/CoreSimulator/Devices(设备plist文件)/data/Containers/Bundle/Application(应用程序包)


    沙盒路径:资源库/Developer/CoreSimulator/Devices(设备plist文件)/data/Containers/Data/Application/(Document、Library、tmp)Library/(Caches缓存、Preferences用户偏好设置)
     
    •应用程序包:(Bundle)包含了所有的资源文件和可执行文件
    •Documents:保存应用运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录。例如,游戏应用可将游戏存档保存在该目录
    •Library/Caches:保存应用运行时生成的需要持久化的数据,iTunes同步设备时不会备份该目录。一般存储体积较大、不需要备份的非重要数据
    •Library/Preference:保存应用的所有偏好设置,iOS的设置应用会在该目录中查找应用的设置信息。iTunes同步设备时会备份该目录
    •tmp:保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时不会备份该目录
     
    1、获取程序的Home目录

    NSString *home = NSHomeDirectory();

    沙盒目录常用获取方式:

    2、获取Documents目录

     NSUserDomainMask 代表从用户文件夹下找

     YES 代表展开路径中的波浪字符“~”

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

     只有一个匹配目录,所以这个集合里面只有一个元素

    NSString *doc = documents[0];

     使用字符串拼接的方式获取目录名

    NSString *doc2 = [home stringByAppendingPathComponent:@"Documents”];

    注意:

    不建议采用字符串拼接的方式获取目录,因为新版本的操作系统可能会修改默认目录名称。

    3、获取Cache目录

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

    NSString *cache = caches[0];

    4、Preferences目录

    通过NSUserDefaults类存取该目录下的设置信息

    5、获取Tmp目录

    NSString *tmpDir = NSTemporaryDirectory();

    说明:获取路径只是一个必要的过程,目的是为了对路径下的文件进行操作。

    二、偏好设置(不论在程序的那个地方,都可以设置数据保存到本地磁盘,作为全局数据来访问,例如界面跳转时可以用来传数据)
    偏好设置的写入:
    •很多iOS应用都支持偏好设置,比如保存用户名、密码、字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能
    •每个应用都有个NSUserDefaults实例,通过它来存取偏好设置
    •例如:保存用户名、字体大小、是否自动登录

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    [defaults setObject:@"itcast.cn" forKey:@"userName"];

    [defaults setFloat:18.0f forKey:@"fontSize"];

    [defaults setBool:YES forKey:@"autoLogin"];

    偏好设置的读取:

    // 读取系统偏好

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    NSString *userName = [defaults objectForKey:@"userName"];

    float fontSize = [defaults floatForKey:@"fontSize"];

    BOOL autoLogin = [defaults boolForKey:@"autoLogin"];

    注意:UserDefaults设置数据时,不是立即写入,而是根据时间戳定时地把缓存中的数据写入本地磁盘。所以调用了set方法之后数据有可能还没有写入磁盘,应用程序就终止了。

    出现以上问题,可以通过调用synchornize方法强制写入:

    [defaults synchronize];

    三、对象归档、解归档(也用来存储数据)
    1、NSKeyedArchiver 归档、解归档(只适用于OC里面内置的对象)

    + (BOOL)archiveRootObject:(id)rootObject toFile:(NSString *)path;//归档

    + (id)unarchiveObjectWithFile:(NSString *)path;//接归档

    2、NSKeyedArchiver 归档、解归档(自定义的对象,必须要实现<NSCoding>协议)

    - (void)encodeWithCoder:(NSCoder *)aCoder;//归档的协议方法

    - (id)initWithCoder:(NSCoder *)aDecoder;//解归档的协议方法

    + (BOOL)archiveRootObject:(id)rootObject toFile:(NSString *)path;//归档

    + (id)unarchiveObjectWithFile:(NSString *)path;//接归档

    3、对多个对象进行归档、解归档

    - (instancetype)initForWritingWithMutableData:(NSMutableData *)data;//用一个可变的data创建归档对象

    - (void)encodeObject:(id)objv forKey:(NSString *)key;//将对象归档

    - (void)finishDecoding//完成归档(必须执行)

    - (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile//将数据写进归档文件中

    - (instancetype)initForReadingWithData:(NSData *)data;//用一个data创建解归档对象,这个data由文件中获取而来

    - (id)decodeObjectForKey:(NSString *)key;//解归档

  • 相关阅读:
    [CF895C]Square Subsets
    Brainf**k(一位数求max)
    [CF1019A]Elections
    [LOJ #2538][PKUWC 2018]Slay the Spire
    [CF911F]Tree Destruction
    [bzoj4832][Lydsy1704月赛]抵制克苏恩
    [洛谷P1420]最长连号
    [bzoj4872][Shoi2017]分手是祝愿
    [洛谷P1887]乘积最大3
    [洛谷P3743]kotori的设备
  • 原文地址:https://www.cnblogs.com/XYQ-208910/p/4822420.html
Copyright © 2011-2022 走看看