归档/解档

1.沙盒路径

/** 沙盒目录 */
- (void)sandBoxDemo
{
    // mainBundle
    NSString *bundlePath = [NSBundle mainBundle].bundlePath;
    NSLog(@"%@", bundlePath);

    // 主目录
    NSString *homeDir = NSHomeDirectory();
    NSLog(@"%@", homeDir);

    // Documents 跟用户个人有关的文档,iTunes、iCloud可以"备份"手机 -> 自动备份Documents目录中的文件
    // 保存应用程序自身生成的数据文件,从网络上下载的文件,不要保存在此文件夹中!
    //可以在标记之后保存到该目录
    //标记方式,标记后不会备份到iCloud
    + (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
    const char* filePath = [[URL path] fileSystemRepresentation];
    
    const char* attrName = "com.apple.MobileBackup";
    u_int8_t attrValue = 1;
    
    int result = setxattr(filePath, attrName, &attrValue, sizeof(attrValue), 0, 0);
    return result == 0;
}
    
    // 1. 提示:要拼接路径,统一使用stringByAppendingPathComponent方法,能够自动处理"/"
    NSString *docDir1 = [homeDir stringByAppendingPathComponent:@"Documents"];
    NSLog(@"%@", docDir1);

    // 2. 专业方法,在OC开发中,一般如果遇到使用函数,这个函数通常是iOS和MAC通用的!
    // 苹果是闭源的系统为了防止苹果调整文档目录的名称,使用下面方法
    /**
     参数
     1. NSDocumentDirectory 搜索路径的类型
     2. NSUserDomainMask    在iOS上固定的
     3. 是否展开波浪号         YES
     */
    NSString *docDir2 = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSLog(@"%@", docDir2);

    // 默认情况下,Documentation是不存在的,如果要使用,需要自己创建!
    // 如果没有创建这个目录,往其中写文件,iOS不会报任何错误!
    NSString *errorDir = [NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES) lastObject];
    NSLog(@"%@", errorDir);

    // 3. Caches 缓存目录,通常保存从网络下载的文件,提供用户离线观看,重新启动,不会被清空
    // 程序员需要提供清理缓存的功能:包括程序清理,检查过期数据,同时提供用户手动清理缓存的操作!
    NSString *cacheDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
    NSLog(@"%@", cacheDir);

    // 4. tmp 目录,通常保存从网络上下载的文件,不需要持久保存,手机重新启动,就会清空
    NSString *tmpDir = NSTemporaryDirectory();
    NSLog(@"%@", tmpDir);

    // 5. Preferences偏好设置目录,保存手机常用设置信息,用户的个人信息,例如用户名,密码
    // 直接使用setXXX方法赋值即可,无需获得路径
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    [defaults setObject:@"rose" forKey:@"UserName"];
    [defaults setBool:YES forKey:@"AutoLogin"];

    // 默认情况下,往偏好设置保存数据,更新的非常慢,如果需要及时保存,需要使用一个同步方法
    [defaults synchronize];
}

注意:

0.提供一个在真机情况下查找到沙盒的办法Xcode -> window ->devices找到自己的项目,选中,找到+ - 号边上的那个,可以下载下来,也可以直接查看
1.在虚拟器情况下,打印出路径的时候才可以才MAC中找到,建议对沙盒进行研究的时候使用虚拟器进行测试,并将结果转嫁到代码中.
2.在自己敲路径的时候,可以点击前两个字母使用tab进行路径补全

福利:

关于文件目录(转载)
iOS学习之iOS沙盒(sandbox)机制和文件操作

一般情况下程序中会在bundle中,也就是程序中内嵌部分压缩包来表示默认的一些字体或者版式,这时候我们可以在使用的时候将这些压缩包利用ZipArchive解压到cache文件中进行解压操作.

2.归档/解档

/** 读取自定义对象 */
- (void)readObj
{
    NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *path = [docDir stringByAppendingPathComponent:@"demoobj.plist"];

    // 从二进制文件读取数据并转换成自定义对象,使用接档
    CZPerson *p = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
    NSLog(@"%@ %d", p.name, p.age);
}

/** 写入自定义对象 */
- (void)writeObj
{
    CZPerson *p = [CZPerson personWithName:@"zhangsan" age:18];

    NSArray *array = @[p];

    NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *path = [docDir stringByAppendingPathComponent:@"demoobj.plist"];

    // 如果要将自定义对象,写入文件,需要使用到一个技术:"归档->保存到文件"
    // 键值归档Archive
    [NSKeyedArchiver archiveRootObject:p toFile:path];

    NSLog(@"OK");
    // 自定义对象无法直接写入
//    [array writeToFile:path atomically:YES];
}

归档/解档的目的是读取/写入自定义的对象,自定义的对象要进行相应的设置,就是在类里面添加两个方法

// 调用[NSKeyedArchiver archiveRootObject:p toFile:path];方法时,会自动调用encodeWithCoder方法对对象进行编码
- (void)encodeWithCoder:(NSCoder *)encoder
{
    // 第一个参数:保存属性的成员变量
    // 第二个参数:保存的键值,通常和对象的属性名一致
    [encoder encodeObject:_name forKey:@"name"];
    [encoder encodeInt:_age forKey:@"age"];
}

// 调用[NSKeyedUnarchiver unarchiveObjectWithFile:path];方法时,会自动调用initWithCoder方法对二进制数据进行解码
// decoder 解码器

- (id)initWithCoder:(NSCoder *)decoder
{
    self = [super init];
    if (self) {
        // *** 注意,使用的键值名称,要与编码时的键名保持一致
        _name = [decoder decodeObjectForKey:@"name"];
        _age = [decoder decodeIntForKey:@"age"];
    }
    return self;
}





3.取值

//普通对象(本例为一张图片)
 NSString *docDir1 = [cacheDir stringByAppendingPathComponent:@"thumb.img"];
    UIImage *image = [UIImage imageWithContentsOfFile:docDir1];
    
    //json对象(取出响应的字典)
    NSError *error = nil;
    NSString *dictPath = [cacheDir stringByAppendingPathComponent:@"data.json"];
    NSData *data = [NSData dataWithContentsOfFile:dictPath];
    
    NSDictionary *photo = [NSJSONSerialization
                           
                           JSONObjectWithData:data
                           
                           options:NSJSONReadingMutableLeaves  
                           
                           error:&error];
    
    //字典转模型
    YQModelLayout *modelLayout = [YQModelLayout modelWithKeyValues:photo];
    
    NSLog(@"%@",image);
    NSLog(@"%zd",modelLayout.ID);

其中,字典转模型,可以考虑的框架MJExtension

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容