***********************沙盒操作**********************************
前往里面的 ~ 相当于 /Users/apple/
目录解析:
1.mainBundle
NSString *bundlePath = [NSBundle mainBundle].bundlePath;
2.主目录
NSString *homeDir = NSHomeDirectory();
3.Document,跟用户个人有关的文档,保存应用程序自身生成的数据文件。
从网络上下载的文件不要保存在此文件夹中!
iTunes、iCloud备份手机 --> 自动备份Document目录中的文件
有3种取法:
1>拼接主目录,不建议使用,要写 "/",可能会漏写
NSString *docDir1 = [homeDir stringByAppendingString:@"/Documents"];
2>拼接主目录,用专门的目录方法,拼接路径这个方法挺好,常用,不过老
NSString *docDir2 = [homeDir stringByAppendingPathComponent:@"Documents"];
3>专业方法!!!!!!!这是一个函数。PS:在OC开发中,一般如果遇到使用函数,这个函数通常是iOS和Mac通用的!
苹果是闭源的系统,为了防止苹果调整文档目录的名称,建议使用这个方法!!!
参数:
1.NSDocumentDirectory 搜索路径的类型为Document
2.NSUserDomainMask 在iOS上是固定的。用户的域集标识,Mac可以填别的。
3.是否展开波浪号
这个函数返回值为数组,在Mac上可能会返回多个值,但是在iOS中只会返回一个值,所以取数组最后一个元素就可以
NSString *docDir3 = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
ps:避免这个错误!!!
专业方法中,第1个参数不要写成NSDocumentationDirectory。Documentation这个文件夹默认是不存在的,这个目录的路径在Library下。如果没有创建这个目录就往其中写文件,iOS不会报任何错误!
4.Caches 缓存目录。
通常保存从网络下载的文件,提供用户离线观看。
程序员要提供清理缓存的功能:包括程序清理,检查过期数据,同时提供用户手动清理缓存的操作!!!
参数:
1.NSCachesDirectory 搜索路径的类型为Cache
2.NSUsrDomainMask 用户域集标识
3.是否展开波浪号
NSString *cacheDir = [NSSearchPathDirectoryInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
5.tmp目录
通常保存从网络上下载的文件,不需要持久保存手机重新启动就会清空。
NSString *tmpDir = NSTemporaryDirectory();
6.Preferences偏好设置目录
保存手机常用设置信息,用户的个人信息,例如用户名,密码
单例模式!default是关键字所以命名为defaults
默认情况下,往偏好设置保存数据,更新的非常慢,如果需要即时保存,需要使用一个同步方法
往偏好设置写数据,直接使用对应的setXXX方法,无需获得路径
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// 写入数据示例,会生成一个项目名的plist文件
[defaults setObject:@"Rose" forKey:@"UserName"];
[defaults setBool:YES forKey:@"AutoLogin"];
// 同步方法
[defaults synchronize];
******************************写文件************************
1.plist
plist能写入的数据类型:
NSString,NSNumber,Boolean,NSData,NSDate这五种可以直接写入plist。
也可以组合成NSDictionary或者NSArray写入
2.归档
如果要将自定义对象写入文件,需要使用到一个技术:“归档”
归档的概念:
归档就是保存到文件,文件中保存的都是二进制数据(字符串)
使用归档的前提:
自定义对象类要遵守 <NSCoding> 协议
encoder: 编码器,把自定义对象,转换成二进制数据
- (void)encodeWithCoder:(NSCoder *)encoder
{
// 参数1:保存属性的成员变量
// 参数2:保存的键值,通常和对象的属性名一致
// 以下为两种类型键值的例子
[encoder encodeObject:_name forKey:@"name"];
[encoder encodeInt:_age forKey:@"age"];
}
decoder:解码器,把二进制数据,转换成自定义对象
- (void)initWithCoder:(NSCoder *)decoder
{
self = [super init];
if(self)
{
// 使用的键值名称要与编码的键名保持一致
_name = [decoder decodeObjectFotKey:@"name"];
_age = [decoder decodeIntForKey:@"age"];
}
return self;
}
键值归档,将自定义对象写入文件
[NSKeyedArchiver archiverRootObject:自定义对象 toFile:文件的绝对路径];
调用这个方法时,会自动调用encodeWithCoder方法对对象进行编码
解档,读取文件中的自定义对象
[NSKeyedUnArchiver unarchiverObjectWithFile:文件的绝对路径];
调用这个方法时,会自动调用initWithCoder方法对对象进行解码
PS:
平时养成看 函数调用堆栈 的习惯
“运行时”机制 runtime 类似于一个操作系统个,是OC运行时提供的底层服务
官方解释:运行时就是方法和方法调用之间的所有内容
运行时是用C语言开发的,主要用于开发OC底层的代码,或者程序员开发一些动态的功能框架会使用到。
数据存储
最新推荐文章于 2024-10-12 10:33:06 发布