沙盒介绍:
获取路径参数介绍:
/**
NSSearchPathForDirectoriesInDomains 是用来查找文件路径的函数,其返回值是一个数组,这个数组中只有一个NSString类型元素,这个元素保存的就是查找的路径。
参数1: NSDocumentDirectory 表示需要查找的是Document文件夹
参数2:NSUserDomainMask 表示在用户的主目录中查找
参数3:YES 表示返回路径展开
*/
iOS 应用程序在安装时,会创建属于自己的沙盒文件,应用程序不能直接访问其他应用程序的沙盒文件,
当应用程序需要向外部请求或接收数据时,都需要经过权限认证,否则,无法获取到数据。
应用程序中所有的非代码文件都保存在沙盒中,比如图片、声音、属性列表,sqlite数据库和文本文件等
沙盒的的根目录有三个文件夹,分别是 Documents,Library,tmp
Documents:中一般保存应用程序本身产生文件数据,例如游戏进度,绘图软件的绘图等, iTunes备份和
恢复的时候,会包括此目录
注意:在此目录下不要保存从网络上下载的文件,否则app无法上架
Documents:
路径获取有3种方法
1.利用字符串拼接,在home目录后面拼接字符串Documents
//获取家目录
NSString*homeDocumentPath = NSHomeDirectory();
//拼接
NSString*documents = [homeDocumentPath stringByAppendingPathComponent:@"Documents"];
2.NSSearchPathForDirectoriesInDomains方法
NSString*path=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,
YES).lastObject;
3.NSFileManager
[[[NSFileManager defaultManager] URLsForDirectory: NSDocumentDirectory
inDomains:NSUserDomainMask] lastObject]
Library:目录下有两个子目录:Caches 和 Preferences
Library/Caches/(这个目录用于存放临时文件,保存应用程序再次启动过程中不需要的信息)
此目录用来保存应用程序运行时生成的需要持久化的数据,这些数据一般存储体积比较大,又不是十分重
要,比如网络请求数据等。这些数据需要用户负责删除。iTunes同步设备时不会备份该目录。
路径同样有三种获取方式:
NSString*homeDocumentPath = NSHomeDirectory();
1.
NSString*cachePath =
[homeDocumentPath stringByAppendingPathComponent:@"Library/Caches"];
2.
NSString*path=
NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask,
YES).lastObject;
3.
[[[NSFileManager defaultManager] URLsForDirectory: NSCachesDirectory
inDomains:NSUserDomainMask] lastObject]
Library/Preferences/(用于存放应用程序专用的支持文件,保存应用程序再次启动过程中需要的信息)
此目录保存应用程序的所有偏好设置,iOS的Settings(设置)应用会在该目录中查找应用的设置信息。
iTunes同步设备时会备份该目录
在Preferences/下不能直接创建偏好设置文件,而是应该使用NSUserDefaults类来取得和设置应用程序的
偏好.
获取路径同上(改一下标红部分即可)
tmp: iTunes不会备份这个目录,用来保存临时数据,应用退出时会清除该目录下的数据
NSString *tmp = NSTemporaryDirectory();
ios 常用的存储方式:
- NSUserDefaults(存在沙盒的Library/Preferences 目录文件夹里)
- 归档(序列化)(存在Documents文件夹下以生成data.archive文件形式存在)
- plist文件(沙盒的Documents中就创建了一个plist文件,并且写入数据保存)
- 数据库
- CoreData
- KeyChain
NSUserDefaults:NSUserDefaults适合存储轻量级的本地数据,比如要保存一个登陆界面的数据,用户名、
密码之类的(支持的数据格式有:NSNumber(Integer、Float、Double),NSString,
NSDate,NSArray,NSDictionary,BOOL类型).
/**
NSUserDefaults*defaults = [NSUserDefaultsstandardUserDefaults];
//保存值(key值同名的时候会覆盖的)
[defaults setObject:@"用户名"forKey:kUsernameKey];
//立即保存
[defaults synchronize];
//取值
NSString*username = [defaults objectForKey:kUsernameKey];
*/
另外的保存方法
//保存NSInteger
[defaults setInteger:(NSInteger) forKey:(nonnullNSString*)];
//保存BOOL
[defaults setBool:(BOOL) forKey:(nonnullNSString*)];
//保存NSURL
[defaults setURL:(nullableNSURL*) forKey:(nonnullNSString*)];
//保存float
[defaults setFloat:(float) forKey:(nonnullNSString*)];
//保存double
[defaults setDouble:(double) forKey:(nonnullNSString*)];
//取值
[defaults integerForKey:(nonnullNSString*)];
[defaults boolForKey:(nonnullNSString*)];
[defaults URLForKey:(nonnullNSString*)];
[defaults floatForKey:(nonnullNSString*)];
[defaults doubleForKey:(nonnullNSString*)];
归档(序列化):一般保存自定义的对象,但是只有遵守NSCoding的类才能使用归档
归档保存自定义对象
定义一个Person类,如果想对person进行归档解档,首先要让Person遵守协议
/********Person.h*********/
#import
//遵守NSCoding协议
@interface Person : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger age;
//自定义的归档保存数据的方法
+(void)savePerson:(Person *)person;
//自定义的读取沙盒中解档出的数据
+(Person *)getPerson;
@end
NSCoding协议有2个方法:
(void)encodeWithCoder:(NSCoder *)aCoder
归档时调用这个方法,在方法中使用encodeObject:forKey:归档变量。
(instancetype)initWithCoder:(NSCoder *)aDecoder
解档时调用这个方法,在方法中石油decodeObject:forKey读出变量。
/******Person.m*******/
#import "Person.h"
@implementation Person
//归档,Key建议使用宏代替,这里就不使用了
- (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeInteger:self.age forKey:@"age"];
}
//解档
-(instancetype)initWithCoder:(NSCoder *)aDecoder {
if (self=[super init]) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.age = [aDecoder decodeIntegerForKey:@"age"];
}
return self;
}
//类方法,运用NSKeyedArchiver归档数据
+(void)savePerson:(Person *)person {
NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
NSString *path=[docPath stringByAppendingPathComponent:@"Person.plist"];
[NSKeyedArchiver archiveRootObject:person toFile:path];
}
//类方法,使用NSKeyedUnarchiver解档数据
+(Person *)getPerson {
NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
NSString *path=[docPath stringByAppendingPathComponent:@"Person.plist"];
Person *person = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
return person;
}
@end
下面就可以在需要的地方归档或解档Person对象。
/*******ViewController.m*******/
//创建Person对象
Person *person = [Person new];
person.name = @"jack";
person.age = 17;
//归档保存数据
[Person savePerson:person];
//解档拿到数据
Person *resultPerson = [Person getPerson];
//打印出结果,证明归档解档成功
NSLog(@"name = %@, age = %ld",resultPerson.name,resultPerson.age);