ios開發(fā)中的沙盒機(jī)制

iOS應(yīng)用儲(chǔ)存分以下幾種:

一、沙盒基本機(jī)制

二、plist儲(chǔ)存

三、偏好設(shè)置

四、NSKeydeArchiver歸檔

一、沙盒基本機(jī)制(sandbox)

iOS系統(tǒng)相對(duì)于Android系統(tǒng),或者相對(duì)于Windows系統(tǒng)來說比較安全的原因很多,其中有一點(diǎn)就是蘋果推出的沙盒機(jī)制,每個(gè)應(yīng)用都有自己對(duì)應(yīng)的沙盒,每個(gè)應(yīng)用程序之間不能相互訪問非本程序的沙盒,所以,Apple相對(duì)于其他的系統(tǒng)來說比較安全,再是從內(nèi)存上來說相對(duì)于Windows來說也比較安全,Apple的應(yīng)用程序在內(nèi)存消耗過高時(shí),收到內(nèi)存警告不及時(shí)處理的話應(yīng)用軟件會(huì)自動(dòng)退出,而不想Windows系統(tǒng)一樣,中了病毒或者木馬會(huì)一直消耗內(nèi)存,知道內(nèi)存沒有了,OK,Down機(jī)。恩,可以這么,沙盒機(jī)制,讓iOS系統(tǒng)變得更安全。

1、bundle

1.1 bundle路徑就是通常所說的應(yīng)用程序在手機(jī)里面的安裝路徑,其就是一個(gè)目錄,這個(gè)目錄就是main bundle。這個(gè)目錄里面通常包含圖像、媒體資源、編譯好的代碼、nib,文件等等。

1.1.1 查看方法bundle,可以通過itunes下載任意應(yīng)用,在Finder中找到下載的應(yīng)用,以歸檔的方式打開ipa包,系統(tǒng)會(huì)解壓出來一個(gè)文件夾,在文件夾中找到.app的文件,這就是我們安裝在手機(jī)里的bundle,右鍵顯示包內(nèi)容可以查看bundle中的文件。

1.1.2 可以通過如下代碼獲取bundle,但是這個(gè)獲取模擬器在Mac上的路徑

[NSBundle mainBundle].bundlePath

2、沙盒

2.1、iOS系統(tǒng)下每個(gè)應(yīng)用都有自己對(duì)應(yīng)的沙盒,每個(gè)沙盒之間都是相互獨(dú)立的,互不能訪問(沒有越獄的情況下)。正因?yàn)檫@樣的沙盒機(jī)制讓iOS的系統(tǒng)變得更安全。

2.2、獲取沙盒路徑的代碼

NSHomeDirectory()

2.3、沙盒中的結(jié)構(gòu)

沙盒的作用就是存儲(chǔ)數(shù)據(jù),每個(gè)沙盒就相當(dāng)于每個(gè)每個(gè)應(yīng)用的系統(tǒng)目錄。

2.3.1、沙盒中的內(nèi)部結(jié)構(gòu)如上圖所示

2.3.1.1、Documents 應(yīng)用程序在運(yùn)行時(shí)生成的一些需要長久保存的數(shù)據(jù)(比如:游戲進(jìn)度存檔、應(yīng)用程序個(gè)人設(shè)置等等),通過 iTunes、iCloud 備份時(shí), 會(huì)備份這個(gè)目錄下的數(shù)據(jù). 此目錄下保存相對(duì)重要的數(shù)據(jù)。

2.3.1.2、Library/Caches 從網(wǎng)絡(luò)上下載的文件或者數(shù)據(jù)(如:音樂緩存、圖片緩存等),此目錄下的數(shù)據(jù)不會(huì)自動(dòng)刪除,需要程序員手動(dòng)清除改目錄下的數(shù)據(jù)。iTunes、iCloud 備份時(shí)不會(huì)備份此目錄下的數(shù)據(jù).主要用于保存應(yīng)用在運(yùn)行時(shí)生成的需要長期使用的數(shù)據(jù).一般用于存儲(chǔ)體積較大,不需要備份的非重要數(shù)據(jù)。

2.3.1.3、保存通過"偏好設(shè)置"寫入的數(shù)據(jù)。設(shè)置應(yīng)用的一些功能會(huì)在該目錄中查找相應(yīng)設(shè)置的信息,iTunes、iCloud備份時(shí),會(huì)備份次目錄下的數(shù)據(jù)。該目錄由系統(tǒng)自動(dòng)管理,通常用來儲(chǔ)存一些基本的應(yīng)用配置信息,比如賬號(hào)密碼,自動(dòng)登錄等。

2.3.1.4、保存應(yīng)用運(yùn)行時(shí)產(chǎn)生的一些臨時(shí)數(shù)據(jù),應(yīng)用程序退出,系統(tǒng)磁盤空間不夠,手機(jī)重啟時(shí),都會(huì)自動(dòng)清除該目錄的數(shù)據(jù)。無需程序員手動(dòng)清除該目錄中的數(shù)據(jù).iTunes、iCloud備份時(shí),不會(huì)備份次目錄。

二、plist儲(chǔ)存

保存在Document文件夾

1.1、利?NSSearchPathForDirectoriesInDomains方法在沙盒中尋在目錄

1.2、NSDocumentDirectory 要尋找的字典對(duì)象,也就是要搜索的目錄,也可以查找NSCachesDirectory和NSPreferencePanesDirectory。

1.3、NSUserDomainMask 代表從用戶目錄下尋找

1.4、是否展開~ ,YES代表展開

1.5、如果為NO打印的結(jié)果為 ~/Documents 不是我們想要的

NSString *doc =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)[0];

1.6、使用這個(gè)方法系統(tǒng)會(huì)判斷doc路徑后面是否有/,沒有會(huì)自動(dòng)添加,如果有則不添加。

NSString *path = [doc stringByAppendingPathComponent:@"test.plist"];

1.7、保存數(shù)據(jù)

plist只能保存集中最基本的數(shù)據(jù)類型,就是writeToFile方法的對(duì)象才能保存在plist文件中

NSDictionary *dict = @{@"test1":@"test2"};[dict writeToFile:path atomically:YES];

1.8、讀取數(shù)據(jù)

NSDictionary *dictTest = [NSDictionary dictionaryWithContentsOfFile:path];

三、偏好設(shè)置

保存在Preference

1、iOS應(yīng)用都可以通過偏好設(shè)置來快速保存用戶登陸賬號(hào),密碼和登陸狀態(tài)等等信息。

2、蘋果提供了一個(gè)NSUserDefaults實(shí)例,通過它來存取偏好設(shè)置。保存格式為plist文件格式。

3、使用偏好設(shè)置來保存數(shù)據(jù), 默認(rèn)存儲(chǔ)在Preferences的文件夾下,偏好設(shè)置數(shù)據(jù)會(huì)將所有的數(shù)據(jù)都保存到Preferences的文件夾下的同一個(gè)plist文件中。

4、使用偏好設(shè)置對(duì)數(shù)據(jù)進(jìn)行保存, 它保存的時(shí)間是不確定的,會(huì)在將來某一時(shí)間自動(dòng)將數(shù)據(jù)保存到Preferences文件夾下,如果需要即刻將數(shù)據(jù)存儲(chǔ),使用[defaults synchronize]。

保存偏好設(shè)置數(shù)據(jù)

// 獲取NSUserDefaults對(duì)象NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];// 保存數(shù)據(jù)[defaults setObject:@"test" forKey:@"test"];// 讓數(shù)據(jù)立刻保存

[defaults synchronize];

####讀取偏好設(shè)置數(shù)據(jù)

// 獲取NSUserDefaults對(duì)象NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];// 讀取數(shù)據(jù)NSString *test = [defaults objectForKey:@"test"];

四、NSKeydeArchiver歸檔

保存在Document文件夾

1、前面兩種方式只能保存plist支持的基本數(shù)據(jù)類型,那么要保存自定義的類對(duì)象,蘋果提供了NSKeydeArchiver歸檔。

2、使用NSKeydeArchiver歸檔必須使被歸檔的類遵守NSCoding協(xié)議并且實(shí)現(xiàn)協(xié)議方法。

Person.h

#import@interfacePerson :NSObject @property (nonatomic,copy)NSString *name;@property (nonatomic,assign)int age;@end

Person.m

#import"Person.h"@implementationPerson// 當(dāng)一個(gè)對(duì)象要保存到文件中的時(shí)候回調(diào)用如下方法,所以重寫該方法,說明保存該對(duì)象的時(shí)候要保存哪些屬性。- (void)encodeWithCoder:(NSCoder *)aCoder {[aCoder encodeObject:self.name forKey:@"name"];[aCoder encodeInteger:self.age forKey:@"age"];}// 當(dāng)一個(gè)對(duì)象從文件中讀取的時(shí)候,系統(tǒng)會(huì)調(diào)用該方法,重寫該方法- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder {if ([super init]) {self.name = [aDecoder decodeObjectForKey:@"name"];self.age = [aDecoder decodeIntForKey:@"age"];}returnself;}@end

ViewController.m

#import"ViewController.h"#import"Person.h"@interfaceViewController ()@end@implementationViewController- (void)viewDidLoad {[super viewDidLoad];// 保存數(shù)據(jù)//1.創(chuàng)建對(duì)象Person *p1 = [[Person alloc] init];p1.name =@"test";p1.age =20;//2.獲取文件路徑NSString *docPath=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)[0];NSString *path=[docPath stringByAppendingPathComponent:@"person.test"];//3.將自定義的對(duì)象保存到文件中[NSKeyedArchiver archiveRootObject:p1 toFile:path];// 讀取數(shù)據(jù)Person *p2 =[NSKeyedUnarchiver unarchiveObjectWithFile:path];}- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.}@end

Tips:通過NSKeydeArchiver保存的數(shù)據(jù)的文件后綴名可以任意命名,并且通過plist保存的數(shù)據(jù)是直接顯示出來的,不安全。通過歸檔方法保存的數(shù)據(jù)在文件中打開是編碼,更安全。

這是我在學(xué)習(xí)過程中發(fā)現(xiàn)的很棒的博客,就把它搬運(yùn)到這里啦~

文章鏈接http://www.cnblogs.com/luckhao/p/5437896.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容