iOS 資料存放區 - 01基本介紹

來源:互聯網
上載者:User

iOS 資料存放區 - 01基本介紹

1、應用沙箱 sandbox

 

1. 什麼是沙箱

 

 

每個iOS應用都有自己的應用沙箱(應用沙箱就是應用的檔案夾),與其他檔案系統隔離。應用必須待在自己的沙箱裡,其他應用不能訪問該沙箱。

 

2.應用沙箱結構

應用程式套件組合: 包含了所有的 資源檔可執行檔

Documents: 儲存應用運行時產生的需要持久化的資料,iTunes同步裝置時會備份該目錄。例如,遊戲應用可將遊戲存檔儲存在該目錄。儲存相對重要的資料 tmp: 儲存應用運行時所需的臨時資料,使用完畢後再將相應的檔案從該目錄刪除。應用沒有運行時,系統也可能會清除該目錄下的檔案。iTunes同步裝置時不會備份該目錄。儲存不重要的並且大的資料。 Library/Caches: 儲存應用運行時產生的需要持久化的資料,iTunes同步裝置時不會備份該目錄。一般儲存體積大、不需要備份的非重要資料 Library/ Preference: 儲存應用的所有喜好設定,iOS的Settings(設定)應用會在該目錄中尋找應用的設定資訊。iTunes同步裝置時會備份該目錄。該目錄由系統管理,無需我們來管理。通常用來儲存一些基本的軟體配置資訊, 比如記住密碼、自動登入等。

3. 應用沙箱目錄的常見擷取方式

沙箱目錄: NSString*home = NSHomeDirectory();

Documents: (2種)

1、利用沙箱跟目錄拼接"Documents"字串

NSString *home = NSHomeDirectory();

 

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

// 不建議採用,因為新版本的作業系統可能會修改目錄名

2、利用NSSearchPathForDirectoriesInDomains函數

 

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

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

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

//在iOS中,只有一個目錄跟傳入的參數匹配,所以這個集合裡面只有一個元素

NSString*documents = [arrayobjectAtIndex:0];

tmp:

 

NSString*tmp= NSTemporaryDirectory();

 

Library/Caches:(跟Documents類似的2種方法)
1、利用山河根目錄拼接"Caches"字串

2、利用NSSearchPathForDirectoriesInDomains函數(將函數的第2個參數改為:NSCachesDirectory即可)

Library/Preference:
通過NSUserDefaults類存取該目錄下的設定資訊
 
 

2、iOS資料存放區的常用方式

 

XML屬性列表(plist)歸檔Preference(喜好設定) 本質還是通過“plist”來儲存資料, 但是使用更簡單(無需關注檔案、檔案夾路徑和名稱)
NSKeyedArchiver歸檔(NSCoding) 把任何對象,直接儲存為檔案 SQLite3 當非常大量的資料存放區時使用 Core Data 對SQLite的封裝

1、屬性列表

屬性列表: 屬性列表是一種XML格式的檔案,拓展名為plist

 

如果對象是NSString、NSDictionary、NSArray、NSData、NSNumber等類型,就可以使用writeToFile:atomically:方法直接將對象寫到屬性列表檔案中

歸檔 NSDictionary

 

// 將資料封裝成字典NSMutableDictionary *dict = [NSMutableDictionary dictionary];[dict setObject:@"母雞" forKey:@"name"];[dict setObject:@"15013141314" forKey:@"phone"];[dict setObject:@"27" forKey:@"age"];// 將字典持久化到Documents/stu.plist檔案中[dict writeToFile:path atomically:YES];
恢複 NSDictionary

 

// 讀取Documents/stu.plist的內容,執行個體化NSDictionaryNSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];NSLog(@"name:%@", [dict objectForKey:@"name"]);NSLog(@"phone:%@", [dict objectForKey:@"phone"]);NSLog(@"age:%@", [dict objectForKey:@"age"]);

 

2、喜好設定

每個應用都有個NSUserDefaults執行個體,通過它來存取喜好設定
擷取使用者喜好設定 儲存資訊
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];[defaults setObject:@"itcast" forKey:@"username"];[defaults setFloat:18.0f forKey:@"text_size"];[defaults setBool:YES forKey:@"auto_login"];

讀取喜好設定

 

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];NSString *username = [defaults stringForKey:@"username"];float textSize = [defaults floatForKey:@"text_size"];BOOL autoLogin = [defaults boolForKey:@"auto_login"];

 

注意: UserDefaults設定資料時,不是立即寫入,而是根據時間戳記定時地把緩衝中的資料寫入本地磁碟。所以調用了set方法之後資料有可能還沒有寫入磁碟應用程式就終止了。出現以上問題,可以通過調用synchornize方法強制寫入

 

[defaults synchornize];

3、NSKeyedArchiver

 

如果對象是NSString、NSDictionary、NSArray、NSData、NSNumber等類型,可以直接用NSKeyedArchiver進行歸檔和恢複 不是所有的對象都可以直接用這種方法進行歸檔,只有遵守了NSCoding協議的對象才可以 NSCoding協議

 

 
encodeWithCoder :

每次歸檔對象時,都會調用這個方法。一般在這個方法裡面指定如何歸檔對象中的每個執行個體變數,可以使用encodeObject:forKey:方法歸檔執行個體變數

initWithCoder:
每次從檔案中恢複(解碼)對象時,都會調用這個方法。一般在這個方法裡面指定如何解碼檔案中的資料為對象的執行個體變數,可以使用decodeObject:forKey方法解碼執行個體變數

歸檔 NSArray
編碼:
[NSKeyedArchiver archiveRootObject:arraytoFile:path]

解碼:

 

NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithFile:path];

 

歸檔 Person 對象

Person:

 

@interface Person : NSObject@property (nonatomic, copy) NSString *name;@property (nonatomic, assign) int age;@property (nonatomic, assign) float height;@end

 

 

@implementation Person- (void)encodeWithCoder:(NSCoder *)encoder {    [encoder encodeObject:self.name forKey:@"name"];    [encoder encodeInt:self.age forKey:@"age"];    [encoder encodeFloat:self.height forKey:@"height"];}- (id)initWithCoder:(NSCoder *)decoder {    self.name = [decoder decodeObjectForKey:@"name"];    self.age = [decoder decodeIntForKey:@"age"];    self.height = [decoder decodeFloatForKey:@"height"];    return self;}- (void)dealloc {    [super dealloc];    [_name release];}@end
歸檔
Person *person = [[[Person alloc] init] autorelease];person.name = @"name";person.age = 30;person.height = 1.80f;[NSKeyedArchiver archiveRootObject:person toFile:path];
解碼
Person *person = [NSKeyedUnarchiver unarchiveObjectWithFile:path];

注意:

 

如果父類也遵守了NSCoding協議,請注意: 應該在encodeWithCoder:方法中加上一句

[super encodeWithCode:encode];

確保繼承的執行個體變數也能被編碼,即也能被歸檔

應該在initWithCoder:方法中加上一句

self = [super initWithCoder:decoder];

確保繼承的執行個體變數也能被解碼,即也能被恢複


 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.