归档和解档

对于系统定义不可变的类型的对象,复制时不会产生新的对象【ns numb string   array dictionary】


r只写
r+xie读
w只读
w+清理完在写
a追加
a+


数据持久化
NSUserDefaults 只能存系统定义的类型,不能存太多或是大数据,可用于系统偏好设置;
plist不能存自定义的数据
NSKeyedArchiver
SQLite数据库
Core Data
XML、JSON简单易于传输

//c语言的文件操作
        FILE *fp = fopen("/Users/apple/Desktop/test.txt", "r+");
        if (fp == NULL) {
            return -1;
        }
        
        char a[10] = {0};
        size_t res = fread(a, 1, 2, fp);
        if (res == 0) {
            printf("read failed
");
        }
        printf("%s
", a);
        fpos_t pos;
        fgetpos(fp, &pos);
        printf("pos: %lld
", pos);
        
        size_t result = fwrite("xyzwopq", 1, 6, fp);
        fgetpos(fp, &pos);
        printf("pos: %lld
", pos);
        
        if (result == 0) {
            printf("write failed
");
        }
        else {
            printf("write success
");
        }
        
        res = fread(a, 1, 2, fp);
        if (res == 0) {
            printf("read failed
");
        }
        printf("%s
", a);
        fgetpos(fp, &pos);
        printf("pos: %lld
", pos);
        
        fclose(fp);


  //属性列表的方式,只能存系统定义的类型
    NSArray *array1 = [NSArray arrayWithContentsOfFile:@"/Users/apple/Desktop/test.plist"];
    NSLog(@"%@", array1);
    
    //1. 只能存系统定义的类型
    //2. 不能存太多数据或者是大数据
    NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];//单(实)例类
    [userDefault setInteger:2340 forKey:@"age"];
//
    NSInteger age = [userDefault integerForKey:@"age"];
    NSLog(@"%d", age);
    
      //二进制编码
    NSString *str = @"123abc";
    NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
    NSLog(@"%@", data);
    
    //从文件中读取数据
    data = [NSData dataWithContentsOfFile:@"/Users/apple/Desktop/a.out"];
    NSLog(@"%@", data);
    
    NSMutableData *mData = [NSMutableData data];
    [mData appendData:data];
    [mData appendData:data];
    
//项文件中写数据
    [mData writeToFile:@"/Users/apple/Desktop/b.out" atomically:YES];
    
    NSURL *url = [NSURL URLWithString:@"http://sqlite.org/images/foreignlogos/nokia.gif"];
    NSData *nokia = [NSData dataWithContentsOfURL:url];
    [nokia writeToFile:@"/Users/apple/Desktop/nokia.gif" atomically:YES];

//////不是系统的数据需要编码取归档,译码再解档//////
@implementation Dog
要实现NSCoding两个方法
- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:_name forKey:kDogNameKey];
}

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super init];
    if (self) {
        self.name = [aDecoder decodeObjectForKey:kDogNameKey];
    }
    
    return self;
}
@end

、、、、、、、、、、、、、、、、、、、、、、

/////////归档与解档

 NSString *str = @"abc";
    [NSKeyedArchiver archiveRootObject:str toFile:@"/Users/apple/Desktop/test.plist"];
    
    NSString *str1 = [NSKeyedUnarchiver unarchiveObjectWithFile:@"/Users/apple/Desktop/test.plist"];
    NSLog(@"%@", str1);
    
    Student *stu = [[Student alloc] init];
    stu.name = @"Zhangsan";
    stu.age = 30;
    
    [NSKeyedArchiver archiveRootObject:stu toFile:@"/Users/apple/Desktop/student.plist"];
    
    Student *stu1 = [NSKeyedUnarchiver unarchiveObjectWithFile:@"/Users/apple/Desktop/student.plist"];
    NSLog(@"%p, %p", stu, stu1);
    NSLog(@"%@:%d, %@:%d", stu.name, stu.age, stu1.name, stu1.age);
    
    NSData *stuData = [NSKeyedArchiver archivedDataWithRootObject:stu];
    [stuData writeToFile:@"/Users/apple/Desktop/stu.plist" atomically:YES];
    
    NSData *stuData2 = [NSData dataWithContentsOfFile:@"/Users/apple/Desktop/stu.plist"];
    Student *stu3 = [NSKeyedUnarchiver unarchiveObjectWithData:stuData2];
    NSLog(@"%@:%d---%@:%d", stu.name, stu.age, stu3.name, stu3.age);
    
    NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
    [userDefault setObject:stuData forKey:@"xxxx"];
    NSData *stuData3 = [userDefault objectForKey:@"xxxx"];
    Student *stu4 = [NSKeyedUnarchiver unarchiveObjectWithData:stuData3];
    NSLog(@"%@:%d", stu4.name, stu4.age);
    
    stu4.dog = [[Dog alloc] init];
    stu4.dog.name = @"小强";
    [NSKeyedArchiver archiveRootObject:stu4 toFile:@"/Users/apple/Desktop/dog.plist”];

、、、、、、、、、、、、、、、、、、、、、、、、、、
iOS沙盒中一共有四个文件夹 • Documents/tmp/app/Library

• 系统提供了获取这些目录的方法

•  NSHomeDirectory()

•  NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirecto ry, NSUserDomainMask, YES);

•  NSString *docDirectory = [paths objectAtIndex: 0];

•  NSTemporaryDirectory()

• 获取当前程序中资源文件路径

• NSString *imagePath = [[NSBundle mainBundle] pathForResource:

@”image” ofType: @”png”]; 



、、、、、、、沙盒机制、、、、、、、、

    NSString *home = NSHomeDirectory();
    NSLog(@"%@", home);
    
    NSString *doc = [home stringByAppendingPathComponent:@"Documents"];
    NSLog(@"%@", doc);
    
    //2.
    NSArray *array = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    NSLog(@"%@", array);
    NSString *doc2 = [array firstObject];
    NSLog(@"%@", doc2);
    
    //3. tmp
    NSString *tmp = NSTemporaryDirectory();
    NSLog(@"%@", tmp);
    
    NSString *name = @"戴维营教育";
    NSString *path = [doc stringByAppendingPathComponent:@"test.plist"];
    [name writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil];
    
    //4.
    NSString *dbPath = [[NSBundle mainBundle] pathForResource:@"testDB" ofType:@"db"];

    NSLog(@"%@", dbPath);
原文地址:https://www.cnblogs.com/lidongq/p/3879858.html