iOS沙盒的了解

1、簡(jiǎn)介

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

2、bundle

2.1 bundle路徑就是通常所說(shuō)的應(yīng)用程序在手機(jī)里面的安裝路徑,其就是一個(gè)目錄,這個(gè)目錄就是'main bundle'。這個(gè)目錄里面通常包含圖像、媒體資源、編譯好的代碼,nib,文件等等。
2.2 查看bundle方法:可以通過(guò)iTunes下載任意應(yīng)用,在Finder中找到下載的應(yīng)用,以歸檔的方式打開(kāi)ipa包,系統(tǒng)就會(huì)解壓出來(lái)一個(gè)文件夾,在文件夾中找到.app的文件,這就是我們安裝在手機(jī)里的bundle,右鍵顯示包內(nèi)容可以查看bundle中的文件。
2.3 可以通過(guò)代碼過(guò)去模擬器在Mac中的bundle路徑
[[NSBundle mainBundle]bundlePath]

3、沙盒

3.1 iOS系統(tǒng)下每個(gè)應(yīng)用都有自己對(duì)應(yīng)的沙盒,每個(gè)沙盒之間是相互獨(dú)立的,互不能訪問(wèn)(沒(méi)有越獄的情況下)。正是因?yàn)檫@樣的沙盒機(jī)制讓iOS系統(tǒng)變得更加安全。
3.2 獲取沙盒路徑的代碼
NSHomeDirectory()
3.3 沙盒中的結(jié)構(gòu)
沙盒的作用就是存儲(chǔ)數(shù)據(jù),每個(gè)沙盒就相當(dāng)于每個(gè)應(yīng)用的系統(tǒng)目錄。

sandbox.png

沙盒的內(nèi)部結(jié)構(gòu)如上圖所示
3.3.1 Documents
應(yīng)用程序在運(yùn)行時(shí)生成的一些需要長(zhǎng)久保存的數(shù)據(jù)(eg:游戲進(jìn)度歸檔,應(yīng)用程序個(gè)人設(shè)置等),通過(guò)iTunes,ICloud備份時(shí),會(huì)備份這個(gè)目錄下的數(shù)據(jù),此目錄下保存相對(duì)重要的數(shù)據(jù)。
3.3.2 Library/Caches
從網(wǎng)絡(luò)上下載的文件或者數(shù)據(jù)(eg:音樂(lè)緩存、圖片緩存等),此目錄下的數(shù)據(jù)不會(huì)自動(dòng)刪除,需要程序員手動(dòng)清除該目錄下的數(shù)據(jù)。iTunes、iCloud備份時(shí)不會(huì)備份此目錄下的數(shù)據(jù),主要用于保存應(yīng)用在運(yùn)行時(shí)生成的需要長(zhǎng)期使用的數(shù)據(jù)。一般用于體積較大,不需要備份的非重要數(shù)據(jù)。

緩存對(duì)象即將被清理如下場(chǎng)景:
①.- (void)removeObjectForKey:(id)key; 手動(dòng)刪除對(duì)象;

②. 緩存對(duì)象超過(guò)了NSCache的屬性限制;(countLimit 和 totalCostLimit )

③ . App進(jìn)入后臺(tái)會(huì)調(diào)用;

④. 系統(tǒng)發(fā)出內(nèi)存警告;

3.3.3 Libraray/Preference
保存通過(guò)“偏好設(shè)置”寫入的數(shù)據(jù)。設(shè)置應(yīng)用的一些功能會(huì)在該目錄中查找相應(yīng)設(shè)置的信息。iTunes、iCloud備份時(shí),會(huì)備份該目錄下的數(shù)據(jù)。該目錄由系統(tǒng)自動(dòng)管理,通常用來(lái)儲(chǔ)存一些基本的應(yīng)用配置信息。比如賬號(hào)密碼,自動(dòng)登錄等。
3.3.4 tmp
保存應(yīng)用運(yùn)行時(shí)產(chǎn)生的一些臨時(shí)數(shù)據(jù),應(yīng)用程序退出,系統(tǒng)磁盤空間不夠,手機(jī)重啟,都會(huì)自動(dòng)清除該目錄的數(shù)據(jù)。無(wú)需程序員手動(dòng)清楚該目錄中的數(shù)據(jù)。iTunes、iCloud備份時(shí),不會(huì)備份此目錄下的數(shù)據(jù)。

4 plist存儲(chǔ)

4.1 在NSSearchPathForDirectoriesInDomain
法在沙盒中尋找目錄
NSDocumentDirectory要尋找的字典對(duì)象,也就是要搜索的目錄,也可以查找NSCachesDirectory和NSPreferencePanesDirectory。
NSUserDomainMask代表從用戶目錄下尋找。
是否展開(kāi)~,YES代表展開(kāi)
如果為NO打印的結(jié)果為~/Documents 不是我們想要的。
NSString *docStr = NSSearchParhForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)[0];

5 偏好設(shè)置

保存在Preference
1、iOS 應(yīng)用都可以通過(guò)偏好設(shè)置來(lái)快速保存用戶登錄賬號(hào),密碼和登錄狀態(tài)等等信息。
2、蘋果提供了一個(gè)NSUserDefaults實(shí)例,通過(guò)它來(lái)存儲(chǔ)偏好設(shè)置,保存格式為plist文件格式。
3、使用偏好設(shè)置來(lái)保存數(shù)據(jù),默認(rèn)存儲(chǔ)在Preferences的文件夾下,偏好設(shè)置數(shù)據(jù)會(huì)將所有的數(shù)據(jù)都保存到Preferences的文件夾下的同一個(gè)plist文件中。
4、使用偏好設(shè)置對(duì)數(shù)據(jù)進(jìn)行保存,它保存的時(shí)間是不確定的,會(huì)在將來(lái)某一段時(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"];

6 NSKeydeArchiver歸檔

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

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

Person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject <NSCoding>

@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int age;

@end
Person.m

#import "Person.h"

@implementation Person

// 當(dāng)一個(gè)對(duì)象要保存到文件中的時(shí)候回調(diào)用如下方法,所以重寫該方法,說(shuō)明保存該對(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"];
}
return self;
}

@end
ViewController.m

#import "ViewController.h"
#import "Person.h"
@interface ViewController ()

@end

@implementation ViewController

- (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

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

最后編輯于
?著作權(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),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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