标签:
参考:http://www.2cto.com/kf/201503/383775.html
http://blog.csdn.net/enuola/article/details/8076221#
http://www.cnblogs.com/kenshincui/p/3885689.html#archiver
iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么.
documents,tmp,app,Library。
(NSHomeDirectory()),
手动保存的文件在documents文件里
Nsuserdefaults保存的文件在tmp文件夹里
1、Documents 目录:您应该将所有de应用程序数据文件写入到这个目录下。这个目录用于存储用户数据或其它应该定期备份的信息。
2、AppName.app 目录:这是应用程序的程序包目录,包含应用程序的本身。由于应用程序必须经过签名,所以您在运行时不能对这个目录中的内容进行修改,否则可能会使应用程序无法启动。
3、Library 目录:这个目录下有两个子目录:Caches 和 Preferences
Preferences 目录:包含应用程序的偏好设置文件。您不应该直接创建偏好设置文件,而是应该使用NSUserDefaults类来取得和设置应用程序的偏好.
Caches 目录:用于存放应用程序专用的支持文件,保存应用程序再次启动过程中需要的信息。
4、tmp 目录:这个目录用于存放临时文件,保存应用程序再次启动过程中不需要的信息。
iphone沙盒(sandbox)中的几个目录获取方式:
// 获取沙盒主目录路径 NSString *homeDir = NSHomeDirectory(); // 获取Documents目录路径 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *docDir = [paths objectAtIndex:0]; // 获取Caches目录路径 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); NSString *cachesDir = [paths objectAtIndex:0]; // 获取tmp目录路径 NSString *tmpDir = NSTemporaryDirectory();
1、直接写文件的方式,可以存储的对象有NSString、NSArray、NSDictionary、NSData、NSNumber,数据全部存放在一个属性列表文件(*.plist文件)中。
2、NSUeserDefaults(偏好设置),用来存储应用设置信息,文件放在perference目录下。
3、归档操作(NSkeyedArchiver),不同于前面两种,它可以把自定义对象存放在文件中。
#import "ViewController.h" @interface ViewController () @end @implementationViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view,typically from a nib. [self mainOperation]; } - (void)mainOperation { //获取沙盒中缓存文件夹路径 //方法一 //沙盒主目录 NSString *homePath = NSHomeDirectory(); //拼接路径 NSString *path = [homePath stringByAppendingPathComponent:@"Library/Caches"]; //方法二 //第一个参数目标文件夹目录(NSCachesDirectory查找缓存文件夹),第二个参数为查找目录的域(NSUserDomainMask为在用户目录下查找),第三个参数为结果中主目录是否展开,不展开则显示为~ NSArray *arr = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); //虽然该方法返回的是一个数组,但是由于一个目标文件夹只有一个目录,所以数组中只有一个元素。 NSString *cachePath = [arr lastObject]; //或者 // NSString *cachePath = [arr objectAtIndex:0]; /** //获取沙盒中Document文件夹或者tmp文件夹路径都可使用上面两种方法 //tmp文件夹路径可直接这样获取 NSString *tmpPath = NSTemporaryDirectory(); NSLog(@"%@",tmpPath); **/ //拼接路径(目标路径),这个时候如果目录下不存在这个lotheve.plist文件,这个目录实际上是不存在的。 NSString *filePath = [cachePath stringByAppendingPathComponent:@"tese.plist"]; NSLog(@"%@",filePath); //创建数据 NSDictionary *content = @{@"字典数据测试1":@"1",@"字典数据测试2":@"2",@"字典数据测试":@"3"}; //将数据存到目标路径的文件中(这个时候如果该路径下文件不存在将会自动创建) //用writeToFile方法写文件会覆盖掉原来的内容 [content writeToFile:filePath atomically:YES]; //读取数据(通过字典的方式读出文件中的内容) NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:filePath]; NSLog(@"%@",dic); } @end
每个应用都有一个NSUesrDefaults实例,通过它可以存储应用配置信息以及用户信息,比如保存用户名、密码、字体大小、是否自动登录等等。数据自动保存在沙盒的Libarary/ Preferences目录下。同样,该方法只能存取NSString、NSArray、NSDictionary、NSData、NSNumber类型的数据。
注意!
代码示例:
#import "LXXViewController.h" @interface LXXViewController () @end @implementationLXXViewController - (void)viewDidLoad { [super viewDidLoad]; self.title = @"NSUserDefaults Demo"; } //点击button保存数据 - (IBAction)saveData:(id)sender { //获取NSUserDefaults对象 NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; //存数据,不需要设置路劲,NSUserDefaults将数据保存在preferences目录下 [userDefaults setObject:@"Lotheve" forKey:@"name"]; [userDefaults setObject:@"NSUserDefaults" forKey:@"demo"]; //立刻保存(同步)数据(如果不写这句话,会在将来某个时间点自动将数据保存在preferences目录下) [userDefaults synchronize]; NSLog(@"数据已保存"); } //点击button读取数据 - (IBAction)getData:(id)sender { //获取NSUserDefaults对象 NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; //读取数据 NSString *name = [userDefaults objectForKey:@"name"]; NSString *demo = [userDefaults objectForKey:@"demo"]; //打印数据 NSLog(@"name = %@ demo =%@",name,demo); } @end
使用归档操作存储数据的主要好处是,不同于前面两种方法只能存储几个常用的数据类型的数据,NSKeyedArchiver可以存储自定义的对象。
代码示例:
需要注意的是,需要保存的对象类一定要引用NSCoding协议,并且实现
接下来看一下自定义的对象如何归档,上面说了如果要对自定义对象进行归档那么这个对象必须实现NSCoding协议,在这个协议中有两个方法都必须实现:
-(void)encodeWithCoder:(NSCoder *)aCoder;通过给定的Archiver对消息接收者进行编码;
-(id)initWithCoder:(NSCoder *)aDecoder;从一个给定的Unarchiver的数据返回一个初始化对象;
Person.h
// // Person.h // FoundationFramework // // Created by Kenshin Cui on 14-2-16. // Copyright (c) 2014年 Kenshin Cui. All rights reserved. // #import <Foundation/Foundation.h> @interface Person : NSObject<NSCoding> @property (nonatomic,copy) NSString *name; @property (nonatomic,assign) int age; @property (nonatomic,assign) float height; @property (nonatomic,assign) NSDate *birthday; @end
Person.m
// // Person.m // FoundationFramework // // Created by Kenshin Cui on 14-2-16. // Copyright (c) 2014年 Kenshin Cui. All rights reserved. // #import "Person.h" @implementation Person #pragma mark 解码 -(id)initWithCoder:(NSCoder *)aDecoder{ NSLog(@"decode..."); if (self=[super init]) { self.name=[aDecoder decodeObjectForKey:@"name"]; self.age=[aDecoder decodeInt64ForKey:@"age"]; self.height=[aDecoder decodeFloatForKey:@"heiht"]; self.birthday=[aDecoder decodeObjectForKey:@"birthday"]; } return self; } #pragma mark 编码 -(void)encodeWithCoder:(NSCoder *)aCoder{ NSLog(@"encode..."); [aCoder encodeObject:_name forKey:@"name"]; [aCoder encodeInt64:_age forKey:@"age" ]; [aCoder encodeFloat:_height forKey:@"height"]; [aCoder encodeObject:_birthday forKey:@"birthday"]; } #pragma mark 重写描述 -(NSString *)description{ NSDateFormatter *formater1=[[NSDateFormatter alloc]init]; formater1.dateFormat=@"yyyy-MM-dd"; return [NSString stringWithFormat:@"name=%@,age=%i,height=%.2f,birthday=%@",_name,_age,_height,[formater1 stringFromDate:_birthday]]; } @end
main.m
// // main.m // FoundationFramework // // Created by Kenshin Cui on 14-2-16. // Copyright (c) 2014年 Kenshin Cui. All rights reserved. // #import <Foundation/Foundation.h> #import "Person.h" int main(int argc,char *argv[]){ //归档 Person *person1=[[Person alloc]init]; person1.name=@"Kenshin"; person1.age=28; person1.height=1.72; NSDateFormatter *formater1=[[NSDateFormatter alloc]init]; formater1.dateFormat=@"yyyy-MM-dd"; person1.birthday=[formater1 dateFromString:@"1986-08-08"]; NSString *path1=@"/Users/kenshincui/Desktop/person1.arc"; [NSKeyedArchiver archiveRootObject:person1 toFile:path1]; //解档 Person *person2= [NSKeyedUnarchiver unarchiveObjectWithFile:path1]; NSLog(@"%@",person2); /*结果: name=Kenshin,age=28,height=0.00,birthday=1986-08-08 */ return 0; }
标签:
原文地址:http://www.cnblogs.com/franzlistan/p/4842404.html