天天看點

iOS:沙盒、偏好設定、歸檔、解歸檔

一、沙盒和應用程式包

•iOS應用程式隻能在為該改程式建立的檔案系統中讀取檔案,不可以去其它地方通路,此區域被稱為沙盒

•iOS常用目錄:

–Bundle

–Documents

–Library/Caches

–Library/Preference

–tmp

顯示mac隐藏檔案:defaults write com.apple.finder AppleShowAllFiles -bool true

隐藏mac隐藏檔案:defaults write com.apple.finder AppleShowAllFiles -bool false

應用程式包路徑:資源庫/Developer/CoreSimulator/Devices(裝置plist檔案)/data/Containers/Bundle/Application(應用程式包)

沙盒路徑:資源庫/Developer/CoreSimulator/Devices(裝置plist檔案)/data/Containers/Data/Application/(Document、Library、tmp)Library/(Caches緩存、Preferences使用者偏好設定)

•應用程式包:(Bundle)包含了所有的資源檔案和可執行檔案

•Documents:儲存應用運作時生成的需要持久化的資料,iTunes同步裝置時會備份該目錄。例如,遊戲應用可将遊戲存檔儲存在該目錄

•Library/Caches:儲存應用運作時生成的需要持久化的資料,iTunes同步裝置時不會備份該目錄。一般存儲體積較大、不需要備份的非重要資料

•Library/Preference:儲存應用的所有偏好設定,iOS的設定應用會在該目錄中查找應用的設定資訊。iTunes同步裝置時會備份該目錄

•tmp:儲存應用運作時所需的臨時資料,使用完畢後再将相應的檔案從該目錄删除。應用沒有運作時,系統也可能會清除該目錄下的檔案。iTunes同步裝置時不會備份該目錄

1、擷取程式的Home目錄

NSString *home = NSHomeDirectory();

沙盒目錄常用擷取方式:

2、擷取Documents目錄

 NSUserDomainMask 代表從使用者檔案夾下找

 YES 代表展開路徑中的波浪字元“~”

NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

 隻有一個比對目錄,是以這個集合裡面隻有一個元素

NSString *doc = documents[0];

 使用字元串拼接的方式擷取目錄名

NSString *doc2 = [home stringByAppendingPathComponent:@"Documents”];

注意:

不建議采用字元串拼接的方式擷取目錄,因為新版本的作業系統可能會修改預設目錄名稱。

3、擷取Cache目錄

NSArray *caches = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);

NSString *cache = caches[0];

4、Preferences目錄

通過NSUserDefaults類存取該目錄下的設定資訊

5、擷取Tmp目錄

NSString *tmpDir = NSTemporaryDirectory();

說明:擷取路徑隻是一個必要的過程,目的是為了對路徑下的檔案進行操作。

二、偏好設定(不論在程式的那個地方,都可以設定資料儲存到本地磁盤,作為全局資料來通路,例如界面跳轉時可以用來傳資料)

偏好設定的寫入:

•很多iOS應用都支援偏好設定,比如儲存使用者名、密碼、字型大小等設定,iOS提供了一套标準的解決方案來為應用加入偏好設定功能

•每個應用都有個NSUserDefaults執行個體,通過它來存取偏好設定

•例如:儲存使用者名、字型大小、是否自動登入

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

[defaults setObject:@"itcast.cn" forKey:@"userName"];

[defaults setFloat:18.0f forKey:@"fontSize"];

[defaults setBool:YES forKey:@"autoLogin"];

偏好設定的讀取:

// 讀取系統偏好

NSString *userName = [defaults objectForKey:@"userName"];

float fontSize = [defaults floatForKey:@"fontSize"];

BOOL autoLogin = [defaults boolForKey:@"autoLogin"];

注意:UserDefaults設定資料時,不是立即寫入,而是根據時間戳定時地把緩存中的資料寫入本地磁盤。是以調用了set方法之後資料有可能還沒有寫入磁盤,應用程式就終止了。

出現以上問題,可以通過調用synchornize方法強制寫入:

[defaults synchronize];

三、對象歸檔、解歸檔(也用來存儲資料)

1、NSKeyedArchiver 歸檔、解歸檔(隻适用于OC裡面内置的對象)

+ (BOOL)archiveRootObject:(id)rootObject toFile:(NSString *)path;//歸檔

+ (id)unarchiveObjectWithFile:(NSString *)path;//接歸檔

2、NSKeyedArchiver 歸檔、解歸檔(自定義的對象,必須要實作<NSCoding>協定)

- (void)encodeWithCoder:(NSCoder *)aCoder;//歸檔的協定方法

- (id)initWithCoder:(NSCoder *)aDecoder;//解歸檔的協定方法

3、對多個對象進行歸檔、解歸檔

- (instancetype)initForWritingWithMutableData:(NSMutableData *)data;//用一個可變的data建立歸檔對象

- (void)encodeObject:(id)objv forKey:(NSString *)key;//将對象歸檔

- (void)finishDecoding//完成歸檔(必須執行)

- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile//将資料寫進歸檔檔案中

- (instancetype)initForReadingWithData:(NSData *)data;//用一個data建立解歸檔對象,這個data由檔案中擷取而來

- (id)decodeObjectForKey:(NSString *)key;//解歸檔

程式猿神奇的手,每時每刻,這雙手都在改變着世界的互動方式!

本文轉自當天真遇到現實部落格園部落格,原文連結:http://www.cnblogs.com/XYQ-208910/p/4822420.html,如需轉載請自行聯系原作者

繼續閱讀