標籤:
OS檔案本地化處理要經過三個步驟,獲得檔案儲存路徑、根據檔案的屬性選擇對應的存檔方式,存檔讀檔的實現。
一、獲得檔案儲存路徑
1."應用程式套件組合": 這裡面存放的是應用程式的源檔案,包括資源檔和可執行檔。
NSString *path = [[NSBundle mainBundle] bundlePath];
2.Documents: 最常用的目錄,iTunes同步該應用時會同步此檔案夾中的內容,適合儲存重要資料。
NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
3.Library/Caches: iTunes不會同步此檔案夾,適合儲存體積大,不需要備份的非重要資料。
NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;
4.tmp: iTunes不會同步此檔案夾,系統可能在應用沒運行時就刪除該目錄下的檔案,所以此目錄適合儲存應用中的一些臨時檔案,用完就刪除。
NSString *path = NSTemporaryDirectory();
5.Library/Preferences: iTunes同步該應用時會同步此檔案夾中的內容,通常儲存應用的設定資訊
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
二:不同的檔案屬性需要有不同的檔案儲存處理方式
1.plist檔案一般儲存的檔案格式
NSArray;
NSMutableArray;
NSDictionary;
NSMutableDictionary;
NSData;
NSMutableData;
NSString;
NSMutableString;
NSNumber;
NSDate;
(1)擷取檔案儲存路徑
(2)儲存
[array writeToFile:fileName atomically:YES];
(3)讀取
NSArray *result = [NSArray arrayWithContentsOfFile:fileName];
( 4 )注意
只有以上列出的類型才能使用plist檔案儲存體。
儲存時使用writeToFile: atomically:方法。 其中atomically表示是否需要先寫入一個輔助檔案,再把輔助檔案拷貝到目標檔案地址。這是更安全的寫入檔案方法,一般都寫YES。
讀取時使用arrayWithContentsOfFile:方法。
2.Preference 設定檔
(1)獲得NSUserDefaults檔案
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
(2)向檔案中寫入內容
[userDefaults setObject:@"AAA"forKey:@"a"];
註:[userDefaults setObject:值 forKey:關鍵詞]
(3)同步到設定檔裡
[userDefaults synchronize];
(4)讀取檔案
NSString *name = [userDefaults objectForKey:@“a”]; //讀取設定檔中為“a”的值
BOOL sex = [userDefaults boolForKey:@"sex"];
註: 要使用對應的物件類型來讀取 設定檔中的值,且需要用對應的方法。
(5)注意
喜好設定是專門用來儲存應用程式的配置資訊的,一般不要在喜好設定中儲存其他資料。
如果沒有調用synchronize方法,系統會根據I/O情況不定時刻地儲存到檔案中。所以如果需要立即寫入檔案的就必須調用synchronize方法。
喜好設定會將所有資料儲存到同一個檔案中。即preference目錄下的一個以此應用程式套件名來命名的plist檔案。
3.NSKeyedArchiver 歸檔
歸檔在iOS中是另一種形式的序列化,只要遵循了NSCoding協議的對象都可以通過它實現序列化。由於決大多數支援儲存資料的Foundation和Cocoa Touch類都遵循了NSCoding協議,因此,對於大多數類來說,歸檔相對而言還是比較容易實現的。
(1)在需要歸檔的對象裡遵守NSCoding協議,並且使用對應的方法
在.h檔案裡面遵守 NSCoding 協議
@interface Person : NSObject
在.m檔案裡實現 NSCoding 協議的方法
//歸檔
- (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:self.avatar forKey:@"avatar"];
[aCoder encodeObject:self.nameforKey:@"name"];
[aCoder encodeInteger:self.age forKey:@"age"];
}
//解檔
- (id)initWithCoder:(NSCoder *)aDecoder {
if([superinit]) {
self.avatar = [aDecoder decodeObjectForKey:@"avatar"];
self.name= [aDecoder decodeObjectForKey:@"name"];
self.age = [aDecoder decodeIntegerForKey:@"age"];
}
returnself;
}
註: 要歸檔子類,必須在實現[super encodeObject:aCoder];[super initWithCoder:aDecoder];方法
(2)使用:
存檔使用NSKeyedArchiver中的archiveRootObject: toFile:方法
// 1.建立檔案路徑
NSString *file = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"person.data"];
// 2.存檔到檔案目錄下
[NSKeyedArchiver archiveRootObject:person toFile:file];
讀檔需要使用NSKeyedUnarchiver 中的 unarchiveObjectWithFile: 方法
// 1.建立檔案路徑
NSString *file = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"person.data"];
// 2.讀取檔案目錄下的檔案
Person *person = [NSKeyedUnarchiver unarchiveObjectWithFile:file];
(3)注意
必須遵循並實現NSCoding協議
儲存檔案的副檔名可以任意指定
繼承時必須先調用父類的歸檔解檔方法
iOS開發 檔案路徑儲存