本地存儲
IOS 沙盒
:每⼀個App都有⼀個存儲空間。iOS系統為每個應⽤程式建立⾃⼰的⽬錄,每個應⽤程式隻能通路⾃⼰的⽬錄,不能互相通。
目錄結構如下所示:
- Documents: 儲存應⽤運⾏時⽣成的需要持久化的資料,iTunes會⾃動備份該⽬錄。蘋果建議将在應⽤程式中浏覽到的⽂件資料儲存在該⽬錄下。
- Library:
- Caches:⼀般存儲的是緩存⽂件,例如圖⽚視訊等,此⽬錄下的⽂件不會再應⽤程式退出時删除。在⼿機備份的時候,iTunes不會備份該⽬錄。例如⾳頻,視訊等⽂件存放其中
- Preferences:儲存應⽤程式的所有偏好設定iOS的Settings(設定),我們不應該直接在這建立⽂件,⽽是需要通過NSUserDefault這個類來通路應⽤程式的偏好設定。iTunes會⾃動備份該⽂件⽬錄下的内容。⽐如說:是否允許通路圖⽚,是否允許通路地理位置…
- tmp:臨時⽂件⽬錄,在程式重新運⾏的時候,和開機的時候,會清空tmp⽂件夾。
擷取目錄的代碼
- (void)viewDidLoad {
[super viewDidLoad];
// 擷取document目錄
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains
(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentPath = [documentPaths objectAtIndex:0];
// 擷取Cache目錄
NSArray *cachePaths = NSSearchPathForDirectoriesInDomains
(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachePath = [cachePaths objectAtIndex:0];
// 擷取Library目錄
NSArray *libraryPaths = NSSearchPathForDirectoriesInDomains
(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *libraryPath = [libraryPaths objectAtIndex:0];
// 擷取Tmp目錄
NSString *tmpPath = NSTemporaryDirectory();
_label.text = [NSString stringWithFormat:@"Document: %@\nCache: %@\nLibrary: %@\nTmp: %@", documentPath, cachePath, libraryPath, tmpPath];
}
檔案操作
檔案操作這裡要用到
NSFileManager
這個類
首先要建立fileManager對象,并且判斷檔案是否存在
// 判斷檔案是否存在
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *document = NSSearchPathForDirectoriesInDomains
(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
NSString *filePath = [document stringByAppendingPathComponent:@"test.txt"];
if ([fileManager fileExistsAtPath:filePath]) {
NSLog(@"test.txt exists");
}
BOOL isDirectory;
if ([fileManager fileExistsAtPath:filePath isDirectory:&isDirectory]) {
}
建立目錄
// 建立目錄
NSString *testDir = [document stringByAppendingPathComponent:@"test"];
// 存放建立失敗的錯誤,友善後面來進行判斷操作
NSError *error;
[fileManager createDirectoryAtPath:testDir withIntermediateDirectories:YES attributes:nil error:&error];
建立檔案
// 建立檔案
NSString *testTxt = [testDir stringByAppendingPathComponent:@"test.txt"];
NSData *data = [@"Hello world!" dataUsingEncoding:NSUTF8StringEncoding];
[fileManager createFileAtPath:testTxt contents:data attributes:nil];
删除檔案
// 删除檔案
[fileManager removeItemAtPath:testTxt error:nil];
檔案讀寫
寫檔案
- (IBAction)write:(id)sender {
// 檔案父目錄
NSString *document = NSSearchPathForDirectoriesInDomains
(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
// 檔案目錄
NSString *filePath = [document stringByAppendingPathComponent:@"text.txt"];
// 寫入的内容
NSString *contents = @"Hello world!";
// 調用writeToFile
[contents writeToFile:filePath atomically:YES
encoding:NSUTF8StringEncoding error:nil];
}
讀檔案
- (IBAction)read:(id)sender {
// 檔案父目錄
NSString *document = NSSearchPathForDirectoriesInDomains
(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
// 檔案目錄
NSString *filePath = [document
stringByAppendingPathComponent:@"text.txt"];
// 将檔案内容讀入字元串
NSString *content = [NSString stringWithContentsOfFile:filePath
encoding:NSUTF8StringEncoding error:nil];
NSLog(@"content %@", content);
}
NSUserDefaults
- NSUserDefaults⽤來存儲 ⽤戶設定 系統配置等⼀些⼩的資料。
- 因為資料是明⽂存儲在 plist ⽂件中,不安全,即使隻是修改⼀個 key 都會 load 整個⽂件,資料多加載慢(IO 記憶體),不适合存儲⼤量資料。
- 它是單例的,也是線程安全的,是以鍵值對 key-value 的形式儲存在沙盒中
- 存儲路徑為:沙盒路徑的Library——>Preferences⽂件夾中
-
⽀持的資料類型有NSString、 NSNumber、NSDate、 NSArray、NSDictionary、BOOL、
NSInteger、NSFloat等系統定義的資料類型,如果要存放其他資料類型或者⾃定義的對象
(如⾃定義的類對象),則必須将其轉換成NSData存儲。
- 即使對象是NSArray或NSDictionary,他們存儲的類型也應該是以上範圍包括的
讀取代碼
// read
NSInteger x = [[NSUserDefaults standardUserDefaults]
integerForKey:@"x"];
NSString *name = [[NSUserDefaults standardUserDefaults]
stringForKey:@"name"];
NSDictionary *dict = [[NSUserDefaults standardUserDefaults]
objectForKey:@"button"];
data = [[NSUserDefaults standardUserDefaults] dataForKey:@"user"];
user = [NSKeyedUnarchiver unarchivedObjectOfClass:[User class]
fromData:data error:nil];
寫入代碼
// save
[[NSUserDefaults standardUserDefaults] setInteger:1024 forKey:@"x"];
[[NSUserDefaults standardUserDefaults] setObject:@"Tom" forKey:@"name"];
[[NSUserDefaults standardUserDefaults] setObject:@{
@"text": @"Cancel",
@"color": @"#ff0000",
} forKey:@"button"];
User *user = [[User alloc] init];
user.userId = 123;
user.nickname = @"Tom";
user.isVip = YES;
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:user requiringSecureCoding:YES error:nil];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"user"];