IOS開發——UI進階篇(十一)應用沙箱,歸檔,解檔,喜好設定,plist儲存,NSData,自訂對象歸檔解檔

來源:互聯網
上載者:User

標籤:

1、iOS應用資料存放區的常用方式
XML屬性列表(plist)歸檔
Preference(喜好設定)
NSKeyedArchiver歸檔(NSCoding)
SQLite3
Core Data

2、應用沙箱
每個iOS應用都有自己的應用沙箱(應用沙箱就是檔案系統目錄),與其他檔案系統隔離。應用必須待在自己的沙箱裡,其他應用不能訪問該沙箱
應用沙箱的檔案系統目錄,如所示(假設應用的名稱叫Layer)
模擬器應用沙箱的根路徑在: (apple是使用者名稱, 8.0是模擬器版本)
/Users/apple/Library/Application Support/iPhone Simulator/8.0/Applications

3、應用沙箱結構分析
應用程式套件組合:(中的Layer)包含了所有的資源檔和可執行檔
Documents:儲存應用運行時產生的需要持久化的資料,iTunes同步裝置時會備份該目錄。例如,遊戲應用可將遊戲存檔儲存在該目錄

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

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

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


4、plist檔案
1.plist儲存,產生一個plist檔案.
2.plist不是數組就是字典,plist儲存就是用來儲存字典或者數組.
注意:Plist不能儲存自訂對象

5、應用沙箱目錄的常見擷取方式
// 擷取沙箱路徑
1、NSHomeDirectory()

2、tmp:NSString *tmp = NSTemporaryDirectory();

3、Library/Caches:(跟Documents類似的2種方法)
利用沙箱根目錄拼接”Caches”字串
利用NSSearchPathForDirectoriesInDomains函數(將函數的參數改為:NSCachesDirectory即可)

// directory:擷取哪個檔案夾    // domainMask:在哪個範圍內搜尋,NSUserDomainMask:表示在使用者的手機上尋找    // expandTilde:是否展開全路徑 YES:表示展開全路徑 NO:不會展開全路徑,會把應用沙箱的路徑用波浪號(~)代替    // 擷取到Caches檔案夾路徑    NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];        // 拼接檔案名稱    NSString *filePath = [cachePath stringByAppendingPathComponent:@"arr.plist"];        // 1、儲存plist,File:檔案的全路徑    [arr writeToFile:filePath atomically:YES];    // 2、讀取plist,之前是什麼類型儲存的,讀取也是什麼    NSArray *arr = [NSArray arrayWithContentsOfFile:filePath];

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

 

6、屬性列表
屬性列表是一種XML格式的檔案,拓展名為plist
如果對象是NSString、NSDictionary、NSArray、NSData、NSNumber等類型,就可以使用writeToFile:atomically:方法直接將對象寫到屬性列表檔案中


7、屬性列表-歸檔NSDictionary
將一個NSDictionary對象歸檔到一個plist屬性列表中

// 將資料封裝成字典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];

 

8、屬性列表-恢複NSDictionary

讀取屬性列表,恢複NSDictionary對象

 

9、喜好設定
很多iOS應用都支援喜好設定,比如儲存使用者名稱、密碼、字型大小等設定,iOS提供了一套標準的解決方案來為應用加入喜好設定功能
每個應用都有個NSUserDefaults執行個體,通過它來存取喜好設定
比如,儲存使用者名稱、字型大小、是否自動登入
以字典的形式進行喜好設定,用法跟字典一樣.
喜好設定好處: 1.不需要關心檔案名稱 2.快速進行索引值對儲存 3.直接儲存基礎資料型別 (Elementary Data Type)

儲存:

    // 擷取單例    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];    // @"123" key:pwd    [defaults setObject:@"123" forKey:@"pwd"];        // bool    [defaults setBool:YES forKey:@"isOn"];        // int    [defaults setInteger:10 forKey:@"num"];

讀取也很簡單

    // 利用NSUserDefaults單例   NSString *pwd = [[NSUserDefaults standardUserDefaults] objectForKey:@"pwd"];   NSInteger i = [[NSUserDefaults standardUserDefaults] integerForKey:@"num"];

 

 

10、NSData
使用archiveRootObject:toFile:方法可以將一個對象直接寫入到一個檔案中,但有時候可能想將多個對象寫入到同一個檔案中,那麼就要使用NSData來進行歸檔對象
NSData可以為一些資料提供臨時儲存空間,以便隨後寫入檔案,或者存放從磁碟讀取的檔案內容。可以使用[NSMutableData data]建立可變資料空間
(圖)

1)NSData-歸檔2個Person對象到同一檔案中

歸檔(編碼)

// 建立一塊可變資料區NSMutableData *data = [NSMutableData data];// 將資料區串連到一個NSKeyedArchiver對象NSKeyedArchiver *archiver = [[[NSKeyedArchiver alloc] initForWritingWithMutableData:data] autorelease];// 開始存檔對象,存檔的資料都會儲存到NSMutableData中[archiver encodeObject:person1 forKey:@"person1"];[archiver encodeObject:person2 forKey:@"person2"];// 存檔完畢(一定要調用這個方法)[archiver finishEncoding];// 將存檔的資料寫入檔案[data writeToFile:path atomically:YES];

2)NSData-從同一檔案中恢複2個Person對象

恢複(解碼)

// 從檔案中讀取資料NSData *data = [NSData dataWithContentsOfFile:path];// 根據資料,解析成一個NSKeyedUnarchiver對象NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];Person *person1 = [unarchiver decodeObjectForKey:@"person1"];Person *person2 = [unarchiver decodeObjectForKey:@"person2"];// 恢複完畢[unarchiver finishDecoding];

3)利用歸檔實現深複製
比如對一個Person對象進行深複製

// 臨時儲存person1的資料NSData *data = [NSKeyedArchiver archivedDataWithRootObject:person1];// 解析data,產生一個新的Person對象Student *person2 = [NSKeyedUnarchiver unarchiveObjectWithData:data];// 分別列印記憶體位址NSLog(@"person1:0x%x", person1); // person1:0x7177a60NSLog(@"person2:0x%x", person2); // person2:0x7177cf0

 

歸檔:
儲存自訂對象

    Person *p = [[Person alloc] init];    p.age = 18;       p.name = @"a";      // 擷取tem檔案夾路徑    NSString *tempPath = NSTemporaryDirectory();    // 拼接檔案名稱   NSString *filePath = [tempPath stringByAppendingPathComponent:@"person.data"];    // NSKeyedArchiver專門用來做自訂對象歸檔    [NSKeyedArchiver archiveRootObject:p toFile:filePath];

 

在person.m

// 什麼時候調用:當一個對象要歸檔的時候就會調用這個方法歸檔// 作用:告訴蘋果當前對象中哪些屬性需要歸檔- (void)encodeWithCoder:(NSCoder *)aCoder{    [aCoder encodeObject:_name forKey:@"name"];    [aCoder encodeInt:_age forKey:@"age"];}

 

解檔:

    // 擷取tem檔案夾路徑    NSString *tempPath = NSTemporaryDirectory();        // 拼接檔案名稱    NSString *filePath = [tempPath stringByAppendingPathComponent:@"person.data"];   // 解檔   Person *p = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];

 

什麼時候調用:當一個對象要解檔的時候就會調用這個方法解檔

// 作用:告訴蘋果當前對象中哪些屬性需要解檔// initWithCoder什麼時候調用:只要解析一個檔案的時候就會調用- (id)initWithCoder:(NSCoder *)aDecoder{    #warning  [super initWithCoder]    // 這裡不能用[super initWithCoder],什麼時候調用[super initWithCoder:aDecoder]:只要父類遵守了NSCoding協議,就調用    if (self = [super init]) {        // 解檔        // 注意一定要記得給成員屬性賦值      _name = [aDecoder decodeObjectForKey:@"name"];      _age = [aDecoder decodeIntForKey:@"age"];    }    return self;}

 

 

11.資料存放區(資料持久化)
1> 介紹iOS資料存放區的5種方式
2> 介紹應用沙箱(應用程式的檔案夾)
• 如何找到應用沙箱的路徑?首先需要顯示隱藏檔案。
• 點擊前往->個人->資產庫->Application Support->iPhone Simulator->7.1->裡面全是應用沙箱
3> 應用沙箱怎麼多檔案夾儲存,在哪個檔案夾。介紹沙箱裡的每一個檔案夾。

 

12.plist儲存
• 把一些系統內建的OC對象產生pilst檔案儲存體起來。
1> 瞭解資料存放區:資料存放區一般有兩個操作,一個存,一個取。拖兩個按鈕,一個用來存,一個用來取
2> plist儲存原理:
• 只要有writeToFile的對象,就能進行plist儲存,調用writeToFile就能自動產生plist格式的檔案。
• 一般常用的Foundation對象都有這個方法,數組,字典,字串等
3> 如何寫入到沙箱,需要擷取沙箱路徑。
• 擷取Documents路徑
• 拼接檔案名稱,因為資料是寫入到檔案中,不是寫入到檔案夾中。路徑之間通過/分開的,為了避免自己寫/,會用stringByAppendingPathCompent,自動在檔案夾與檔案之間添加/。
4> 如何讀取,儲存是什麼類型儲存,讀取出來也是什麼類型,直接用儲存的類型,解析檔案就好,用ContentsOfFile解析。
5> 注意plist儲存,不能儲存自訂對象,會失敗的。

 

13> 喜好設定
1> 什麼是喜好設定儲存:就是儲存一些基本的資訊,帳號,密碼,狀態。
2> 喜好設定原理:不需要關心檔案名稱,直接通過NSUserDefaults操作,預設就存到喜好設定裡面了。
• 通過NSUserDefaults就能直接存取軟體的喜好設定(Library/Preferences)
3> 怎麼利用喜好設定儲存?利用NSUserDefaults調用setObject:forKey儲存。
• 喜好設定底層實現原理:底層其實就是利用一個字典,儲存一些索引值對。
• 喜好設定好處:能快速儲存一些索引值對,如果用字典去儲存,還需要擷取檔案名稱比較麻煩。
• 喜好設定壞處:不能及時儲存,需要做同步操作,把記憶體中的資料同步到硬碟上。
4> 怎麼利用喜好設定讀取?和字典一樣,根據剛剛儲存的Key讀取。

 

14> 自訂對象歸檔(歸檔:資料存放區)
1> 自訂對象如何歸檔:用NSKeyedArchiver,調用archiveRootObject:toFile:方法,需要傳一個對象,自訂一個對象,傳進去。
• 會報錯,說對象沒有encodeWithCoder方法,說明歸檔的時候預設會調用這個方法,去實現這個方法。
• 預設打不出encodeWithCoder,必須遵守NSCoding協議才能實現這個方法。
• encodeWithCoder什麼時候調用:對象歸檔時候調用
• encodeWithCoder作用:告訴系統對象裡的哪些屬性需要歸檔,怎麼去歸檔,根據一個key去歸檔,目的就是以後取的時候,也根據這個key去取資料。
2> 自訂對象如何解檔:用NSKeyedUnarchiver,調用unarchiveObjectWithFile方法,需要傳一個檔案名稱。
• 會報錯,說對象沒有initWithCoder方法,說明解檔的時候預設會調用這個方法,去實現這個方法。
• initWithCoder什麼時候調用:對象解檔時候調用
• initWithCoder作用:告訴系統對象裡的哪些屬性需要解檔,怎麼去解檔,根據之前儲存的key去解檔
• initWithCoder是一個初始化方法,需要先初始化父類的,但是不能調用[super initWithCoder:],因為父類NSObject沒有遵守NSCoding協議。
3> initWithCoder什麼時候需要調用[super initWithCoder:]
• initWithCoder原理:只要解析檔案就會調用,xib,storyboard都是檔案,因此只要解析這兩個檔案,就會調用initWithCoder。
• 因此如果在storyboard使用自訂view,重寫initWithCoder方法,一定要調用[super initWithCoder:],因為只有系統才知道怎麼解析storyboard,如果沒有調用,就解析不了這個檔案。

 

IOS開發——UI進階篇(十一)應用沙箱,歸檔,解檔,喜好設定,plist儲存,NSData,自訂對象歸檔解檔

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.