沙盒是用來存入緩沖區(qū)的撼玄,APP關(guān)掉,緩存被自動清理。
可以寫入沙盒的有字符串
數(shù)組(最簡單的數(shù)組鳍征,復(fù)雜的寫入不了(也許可以,但是我還沒有找到方法))
例子:
//? ? 數(shù)組寫入本地
NSArray *arr = [NSArray arrayWithObjects:@"11", @"22", @"33", nil];(這種最簡單的數(shù)組)
//? ? 拼接? (數(shù)組寫入本地后綴可以是xml/plist面徽,? 存入的字典一樣)
NSString *arrPath = [path stringByAppendingPathComponent:@"arr.xml"];
[arr? writeToFile:arrPath atomically:YES];
復(fù)雜數(shù)據(jù)寫入沙盒(稱未歸檔和反歸檔):
- (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;
以上是系統(tǒng)里面的類型艳丛,也就是可以寫入沙盒的類型,我嘗試將一個復(fù)雜的數(shù)組寫入趟紊,但是失敗了氮双,簡單的類型想上面的都可以。
也許你會問上面不是有id類型的么霎匈?為什么寫入不了戴差,這個我也不知道,但是我沒寫入進去唧躲。
實在解決不了造挽,我是將我申請的數(shù)據(jù)碱璃,以字符串的形式直接寫入沙盒,然后在用的時候再次解析饭入,本來打算解析完嵌器,寫入沙盒,省去再次解析的重復(fù)代碼量谐丢,可惜沒成功爽航。
以下 是我的筆記(比較亂):
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"];
//? ? 參數(shù)1: 寫入的文件路徑
//? ? 參數(shù)2: 保證寫入文件的時候的 線程 安全
//? ? 參數(shù)3: 編碼格式
//? ? 參數(shù)4: 錯誤信息
NSError *error = nil;
[str writeToFile:strPath atomically:YES encoding:NSUTF8StringEncoding error:&error];
//? ? 讀取
//? ? NSString *readStr = [NSString stringWithContentsOfFile:<#(NSString *)#> encoding:<#(NSStringEncoding)#> error:<#(NSError **)#>]
//? ? 數(shù)組寫入本地
NSArray *arr = [NSArray arrayWithObjects:@"11", @"22", @"33", nil];
//? ? 拼接? (數(shù)組寫入本地后綴可以是xml/plist乾忱,? 存入的字典一樣)
NSString *arrPath = [path stringByAppendingPathComponent:@"arr.xml"];
[arr? writeToFile:arrPath atomically:YES];
//? ? 3.復(fù)雜對象寫入本地
Boss *boss = [[Boss alloc] init];
boss.name = @"老管";
boss.number = 30;
boss.sex = @"unknown";
//? ? 將一個實現(xiàn)了NSCoding的協(xié)議的對象寫入本地
//? ? 歸檔類: 使用歸檔類將復(fù)雜對象寫入本地
NSString *bossPath = [path stringByAppendingPathComponent:@"boss.aa"];
[NSKeyedArchiver archiveRootObject:boss toFile:bossPath];
//? ? 反歸檔類(將本地的數(shù)據(jù)重新產(chǎn)生一個新的對象):
Boss *bossReturn = [NSKeyedUnarchiver unarchiveObjectWithFile:bossPath];
NSLog(@"%@", bossReturn.name);
[boss release];
以下是復(fù)雜數(shù)據(jù)寫入沙盒需要的類:
.h文件中(簽協(xié)議讥珍,寫屬性就好)
//編碼協(xié)議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
{
//? ? 編碼的方法, 將數(shù)據(jù)編碼成可以寫入本地的狀態(tài)
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeObject:self.sex? forKey:@"sex"];
[aCoder encodeInteger:self.number forKey:@"number"];
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
//? ? 解碼的方法窄瘟, 從本地讀取數(shù)據(jù)衷佃, 重新創(chuàng)建對象進行初始化
self = [super init];
if (self) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.sex = [aDecoder decodeObjectForKey:@"sex"];
self.number = [aDecoder decodeIntegerForKey:@"number"];
}
return self;
}