iOS-沙盒機制

iOS開發之沙盒機制

iOS應用儲存分以下幾種:

一、沙盒基本機制

二、plist儲存

三、偏好設置

四、NSKeydeArchiver歸檔

 


一、沙盒基本機制(sandbox)

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

1、bundle

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

1.1.1 查看方法bundle,可以通過itunes下載任意應用,在Finder中找到下載的應用,以歸檔的方式打開ipa包,系統會解壓出來一個文件夾,在文件夾中找到.app的文件,這就是我們安裝在手機裏的bundle,右鍵顯示包內容可以查看bundle中的文件。

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

[NSBundle mainBundle].bundlePath

2、沙盒

2.1、iOS系統下每個應用都有自己對應的沙盒,每個沙盒之間都是相互獨立的,互不能訪問(沒有越獄的情況下)。正因爲這樣的沙盒機制讓iOS的系統變得更安全。

2.2、獲取沙盒路徑的代碼

NSHomeDirectory()

2.3、沙盒中的結構

沙盒的作用就是存儲數據,每個沙盒就相當於每個每個應用的系統目錄。

2.3.1、沙盒中的內部結構如上圖所示


2.3.1.1、Documents 應用程序在運行時生成的一些需要長久保存的數據(比如:遊戲進度存檔、應用程序個人設置等等),通過 iTunes、iCloud 備份時, 會備份這個目錄下的數據. 此目錄下保存相對重要的數據。

2.3.1.2、Library/Caches 從網絡上下載的文件或者數據(如:音樂緩存、圖片緩存等),此目錄下的數據不會自動刪除,需要程序員手動清除改目錄下的數據。iTunes、iCloud 備份時不會備份此目錄下的數據.主要用於保存應用在運行時生成的需要長期使用的數據.一般用於存儲體積較大,不需要備份的非重要數據。

2.3.1.3、保存通過"偏好設置"寫入的數據。設置應用的一些功能會在該目錄中查找相應設置的信息,iTunes、iCloud備份時,會備份次目錄下的數據。該目錄由系統自動管理,通常用來儲存一些基本的應用配置信息,比如賬號密碼,自動登錄等。

2.3.1.4、保存應用運行時產生的一些臨時數據,應用程序退出,系統磁盤空間不夠,手機重啓時,都會自動清除該目錄的數據。無需程序員手動清除該目錄中的數據.iTunes、iCloud備份時,不會備份次目錄。

二、plist儲存

保存在Document文件夾

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

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

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

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

1.5、如果爲NO打印的結果爲 ~/Documents 不是我們想要的

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

1.6、使用這個方法系統會判斷doc路徑後面是否有/,沒有會自動添加,如果有則不添加。

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

1.7、保存數據

plist只能保存集中最基本的數據類型,就是writeToFile方法的對象才能保存在plist文件中

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

1.8、讀取數據

NSDictionary *dictTest = [NSDictionary dictionaryWithContentsOfFile:path];  

三、偏好設置

保存在Preference

1、iOS應用都可以通過偏好設置來快速保存用戶登陸賬號,密碼和登陸狀態等等信息。

2、蘋果提供了一個NSUserDefaults實例,通過它來存取偏好設置。保存格式爲plist文件格式。

3、使用偏好設置來保存數據, 默認存儲在Preferences的文件夾下,偏好設置數據會將所有的數據都保存到Preferences的文件夾下的同一個plist文件中。

4、使用偏好設置對數據進行保存, 它保存的時間是不確定的,會在將來某一時間自動將數據保存到Preferences文件夾下,如果需要即刻將數據存儲,使用[defaults synchronize]。


保存偏好設置數據

// 獲取NSUserDefaults對象
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

// 保存數據
[defaults setObject:@"test" forKey:@"test"];

// 讓數據立刻保存
[defaults synchronize];

####讀取偏好設置數據

// 獲取NSUserDefaults對象
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

// 讀取數據
NSString *test = [defaults objectForKey:@"test"];

四、NSKeydeArchiver歸檔

保存在Document文件夾

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

2、使用NSKeydeArchiver歸檔必須使被歸檔的類遵守NSCoding協議並且實現協議方法。

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

// 當一個對象要保存到文件中的時候回調用如下方法,所以重寫該方法,說明保存該對象的時候要保存哪些屬性。
- (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeInteger:self.age forKey:@"age"];
}

// 當一個對象從文件中讀取的時候,系統會調用該方法,重寫該方法
- (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];

// 保存數據
//1.創建對象
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.將自定義的對象保存到文件中
[NSKeyedArchiver archiveRootObject:p1 toFile:path];

// 讀取數據
Person *p2 =[NSKeyedUnarchiver unarchiveObjectWithFile:path];

}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

@end

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

發佈了43 篇原創文章 · 獲贊 13 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章