您的位置:首页 > 移动开发 > IOS开发

iOS开发总结之沙盒存储

2016-09-12 14:16 141 查看


每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离。应用必须待在自己的沙盒里,其他应用不能访问该沙盒。沙盒下的目录如下:

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

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

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

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

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

1.属性列表plist存储

    /*

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

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

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

     */

[objc] view
plain copy

 





/** 

 *   点击保存按钮 

 */  

- (IBAction)saveDataBtnClick:(id)sender {  

      

      

    // NSUserDomainMask 在用户目录下查找  

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

    // NSDocumentDirectory 查找Documents文件夹  

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

    // 拼接文件路径   上面获取的文件路径加上文件名  

    NSString *path = [doc stringByAppendingPathComponent:@"abc.plist"];  

    NSLog(@"%@", path);  

    /* 

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

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

     */  

      

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

      

    NSDictionary *dict = @{@"person": @"abc"};  

    [dict writeToFile:path atomically:YES];  

}  

/** 

 *   点击读取按钮 

 */  

- (IBAction)readDataBtnClick:(id)sender {  

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

      

    NSString *path = [doc stringByAppendingPathComponent:@"abc.plist"]  

    ;  

    // 读取数据  

    NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];  

    NSLog(@"%@", dict);  

}  

属性列表-NSDictionary的存储和读取过程






2.偏好设置

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

[objc] view
plain copy

 





<pre name="code" class="objc">- (IBAction)saveBtn:(id)sender {  

  

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

    // 如果利用系统的偏好设置来存储数据, 默认就是存储在Preferences文件夹下面的  

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

      

    // 获取NSUserDefaults对象  

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];  

      

    // 保存数据(如果设置数据之后没有同步, 会在将来某一时间点自动将数据保存到Preferences文件夹下面)  

    [defaults setObject:@"tinghou" forKey:@"name"];  

    [defaults setObject:@"man" forKey:@"gender"];  

    [defaults setInteger:13 forKey:@"age"];  

    [defaults setDouble:10.1 forKey:@"height"];  

      

      

    // 让NSUserDefaults立刻保存数据 注意:UserDefaults设置数据时,不是立即写入,而是根据时间戳定时地把缓存中的数据写入本地磁盘。所以调用了set方法之后数据有可能还没有写入磁盘应用程序就终止了。出现以上问题,可以通过调用synchornize方法强制写入  

  

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

  

}  

  

- (IBAction)readBtn:(id)sender {  

      

    // 1.获取NSUserDefaults  

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];  

    // 2.通过NSUserDefaults获取保存的数据  

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

    int age = [defaults integerForKey:@"age"];  

    NSLog(@"%@", name);  

    NSLog(@"%d", age);  

}  



[objc] view
plain copy

 





+(BOOL)isFirstOpen{  

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];  

    BOOL firstOpen = [userDefaults boolForKey:@"firstOpen"];  

    return firstOpen;  

}  

+(void)setFirstOpen:(BOOL)b{  

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];  

    [userDefaults setBool:b forKey:@"firstOpen"];  

    [userDefaults synchronize];  

}  

  

+(BOOL)login{  

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];  

    BOOL loginState = [userDefaults boolForKey:@"login"];  

    return loginState;  

}  

  

+(BOOL)setLogin:(BOOL)loginState{  

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];  

    [userDefaults setBool:loginState forKey:@"login"];  

    [userDefaults synchronize];  

    return loginState;  

}  



3.归档

如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,可以直接用NSKeyedArchiver进行归档和恢复
不是所有的对象都可以直接用这种方法进行归档,只有遵守了NSCoding协议的对象才可以
NSCoding协议有2个方法:
encodeWithCoder:
每次归档对象时,都会调用这个方法。一般在这个方法里面指定如何归档对象中的每个实例变量,可以使用encodeObject:forKey:方法归档实例变量

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



[objc] view
plain copy

 





- (IBAction)saveBtnClick:(id)sender {  

    // 1.创建对象  

    /* 

    NJPerson *p = [[NJPerson alloc] init]; 

    p.name = @"lnj"; 

    p.age = 100; 

    p.height = 1.76; 

     */  

      

    NJStudent *stu = [[NJStudent alloc] init];  

    stu.name = @"lnj";  

    stu.age = 100;  

    stu.height = 1.8;  

    stu.weight = 60;  

      

    // 2.获取文件路径 (获取文件路径方法和plist存储的一样)  

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

    //用上面获得的文件路径(document)加上文件名  拼接文件路径  

    NSString *path = [docPath stringByAppendingPathComponent:@"stu.xxoo"];  

    NSLog(@"path = %@", path);  

      

    // 3.将自定义对象保存到文件中  

//    [NSKeyedArchiver archiveRootObject:p toFile:path];  

    [NSKeyedArchiver archiveRootObject:stu toFile:path];  

      

}  

  

- (IBAction)readBtnClick:(id)sender {  

      

    // 1.获取文件路径  

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

    NSString *path = [docPath stringByAppendingPathComponent:@"stu.xxoo"];  

  

    // 2.从文件中读取对象  

//    NJPerson *p = [NSKeyedUnarchiver unarchiveObjectWithFile:path];  

      

    NJStudent *stu = [NSKeyedUnarchiver unarchiveObjectWithFile:path];  

  

      

    NSLog(@"%@ %d %.1f %.1f", stu.name, stu.age, stu.height, stu.weight);  

}  

NSKeyedArchiver归档如果想将一个自定义对象保存到文件中必须实现NSCoding协议










4.ios沙盒目录

1、获取程序的Home目录

      NSString  *path = NSHomeDirectory();

      NSLog(@"path:%@",path);

      打印结果:

path:/Users/username/Library/Application Support/iPhone Simulator/5.1/Applications/BAE91297-A4C6-4DDC-A9DA-7B790B36CE7A

   真机上的目录是:

/var/mobile/Applications/3B8EC78A-5EEE-4C2F-B0CB-4C3F02B996D2

   可见,真机上的目录是/var/mobile/Applications/这个目录下的,和模拟器不一样。这个是Home目录,其他的子目录和模拟器一样。

2、获取Document目录

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

   NSString *path = [paths objectAtIndex:0]; 

   NSLog(@"path:%@", path); 

   打印结果: 

  path:/Users/username/Library/Application Support/iPhone Simulator/5.1/Applications/BAE91297-A4C6-4DDC-A9DA-7B790B36CE7A/Documents

3、获取Cache目录

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

   NSString *path = [paths objectAtIndex:0]; 

   NSLog(@"path:%@", path); 

   打印结果:

path:/Users/username/Library/Application Support/iPhone Simulator/5.1/Applications/BAE91297-A4C6-4DDC-A9DA-7B790B36CE7A/Library/Caches

4、获取Library目录

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

   NSString *path = [paths objectAtIndex:0]; 

   NSLog(@"path:%@", path);

   打印结果:

path:/Users/username/Library/Application Support/iPhone Simulator/5.1/Applications/BAE91297-A4C6-4DDC-A9DA-7B790B36CE7A/Library

5、获取Tmp目录

   NSString *path = NSTemporaryDirectory(); 

   NSLog(@"%@", path);

   打印结果:

path:/var/folders/hj/8sgyk0f555l1z_n95p2b2kp00000gn/T/  

6、写入文件

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

   NSString *docDir = [paths objectAtIndex:0];

   if(!docDir) {

        NSLog(@"Documents 目录未找到");

   }

   NSArray *array = [[NSArray alloc] initWithObjects:@"内容",@"content",nil];

   NSString *filePath = [docDir stringByAppendingPathComponent:@"testFile.txt"];

   [array writeToFile:filePath atomically:YES];

7、读取文件

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

   NSString *docDir = [paths objectAtIndex:0];

   NSString *filePath = [docDir stringByAppendingPathComponent:@"testFile.txt"];

   NSArray *array = [[NSArray alloc] initWithContentsOfFile:filePath];

   NSLog(@"%@",array);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: