沙盒是用来存入缓冲区的,APP关掉,缓存被自动清理。
可以写入沙盒的有字符串
数组(最简单的数组,复杂的写入不了(也许可以,但是我还没有找到方法))
例子:
// 数组写入本地
NSArray *arr = [NSArray arrayWithObjects:@"11", @"22", @"33", nil];(这种最简单的数组)
// 拼接 (数组写入本地后缀可以是xml/plist, 存入的字典一样)
NSString *arrPath = [path stringByAppendingPathComponent:@"arr.xml"];
[arr writeToFile:arrPath atomically:YES];
复杂数据写入沙盒(称未归档和反归档):
- (void)encodeObject:(id)objv forKey:(NSString *)key;
- (void)encodeConditionalObject:(id)objv forKey:(NSString *)key;
- (void)encodeBool:(BOOL)boolv forKey:(NSString *)key;
- (void)encodeInt:(int)intv forKey:(NSString *)key;
- (void)encodeInt32:(int32_t)intv forKey:(NSString *)key;
- (void)encodeInt64:(int64_t)intv forKey:(NSString *)key;
- (void)encodeFloat:(float)realv forKey:(NSString *)key;
- (void)encodeDouble:(double)realv forKey:(NSString *)key;
- (void)encodeBytes:(const uint8_t *)bytesp length:(NSUInteger)lenv forKey:(NSString *)key;
以上是系统里面的类型,也就是可以写入沙盒的类型,我尝试将一个复杂的数组写入,但是失败了,简单的类型想上面的都可以。
也许你会问上面不是有id类型的么?为什么写入不了,这个我也不知道,但是我没写入进去。
实在解决不了,我是将我申请的数据,以字符串的形式直接写入沙盒,然后在用的时候再次解析,本来打算解析完,写入沙盒,省去再次解析的重复代码量,可惜没成功。
以下 是我的笔记(比较乱):
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [paths lastObject];
NSLog(@"dacuments文件夹的路径: %@", path);
// 2. 简单对象的读写操作
// NSString, NSArray, NSDictionary, NSData...
// 字符串写入本地
NSString *str = @"王老吉和尹啸然在一起干什么!";
// 拼接一个文件路径
NSString *strPath = [path stringByAppendingString:@"/111.txt"];
// 参数1: 写入的文件路径
// 参数2: 保证写入文件的时候的 线程 安全
// 参数3: 编码格式
// 参数4: 错误信息
NSError *error = nil;
[str writeToFile:strPath atomically:YES encoding:NSUTF8StringEncoding error:&error];
// 读取
// NSString *readStr = [NSString stringWithContentsOfFile:<#(NSString *)#> encoding:<#(NSStringEncoding)#> error:<#(NSError **)#>]
// 数组写入本地
NSArray *arr = [NSArray arrayWithObjects:@"11", @"22", @"33", nil];
// 拼接 (数组写入本地后缀可以是xml/plist, 存入的字典一样)
NSString *arrPath = [path stringByAppendingPathComponent:@"arr.xml"];
[arr writeToFile:arrPath atomically:YES];
// 3.复杂对象写入本地
Boss *boss = [[Boss alloc] init];
boss.name = @"老管";
boss.number = 30;
boss.sex = @"unknown";
// 将一个实现了NSCoding的协议的对象写入本地
// 归档类: 使用归档类将复杂对象写入本地
NSString *bossPath = [path stringByAppendingPathComponent:@"boss.aa"];
[NSKeyedArchiver archiveRootObject:boss toFile:bossPath];
// 反归档类(将本地的数据重新产生一个新的对象):
Boss *bossReturn = [NSKeyedUnarchiver unarchiveObjectWithFile:bossPath];
NSLog(@"%@", bossReturn.name);
[boss release];
以下是复杂数据写入沙盒需要的类:
.h文件中(签协议,写属性就好)
//编码协议NSCoding@interface Boss : NSObject@property (nonatomic, retain) NSString *name;
@property (nonatomic, assign) NSInteger number;
@property (nonatomic, retain) NSString *sex;
.m文件中(写归档和反归档):
-(void)dealloc
{
[_name release];
[_sex release];
[super dealloc];
}
- (void)encodeWithCoder:(NSCoder *)aCoder
{
// 编码的方法, 将数据编码成可以写入本地的状态
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeObject:self.sex forKey:@"sex"];
[aCoder encodeInteger:self.number forKey:@"number"];
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
// 解码的方法, 从本地读取数据, 重新创建对象进行初始化
self = [super init];
if (self) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.sex = [aDecoder decodeObjectForKey:@"sex"];
self.number = [aDecoder decodeIntegerForKey:@"number"];
}
return self;
}
网友评论