內容大綱
- 如何存儲記錄
- 備忘錄模式的基本原理
- 使用備忘錄模式
- 優化存儲方案
- 恢復UIView的狀態
1、如何存儲記錄
在存儲記錄時,第一步我們需要用一把鑰匙去打開一把鎖。第二步,當我們打開鎖之后就會有黑盒子,我們一開始還不知道里面有什么,所以是黑盒子。
1、存儲記錄的必要性
生活中,比如去超市購物有時候就需要在入口儲物櫃存放自己的包裹
2、記錄的唯一標示
儲物櫃對應一把鑰匙和號碼標示。
3、存儲記錄與取出記錄
===============================================================================================

根據上面的思維導圖:備忘錄模式有:1.有key值(唯一標示符) 2.獲取與key對應的存儲物品 3.可以存儲多樣性的對象。
備忘錄模式的UML圖:
2、備忘錄模式的基本原理
Originator起因;起源;創作者;發起人,對象:能夠生成備忘錄中心的狀態值 Memento紀念品,記錄,備忘錄中心,能夠將對象生成的備忘錄中的狀態值進行存儲或者取出值 Caretaker看門人,備忘錄中心存在黑箱子里的物品
設計存儲中心,比如超市里的儲物櫃
指定存儲接口,
實現存儲機制,

備忘錄模式(Memento Pattern)又叫做快照模式(Snapshot Pattern)或Token模式,是GoF的23種設計模式之一,屬於行為模式。
定義:在不破壞封閉的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態。這樣以后就可將該對象恢復到原先保存的狀態。
涉及角色:
1.Originator(發起人):負責創建一個備忘錄Memento,用以記錄當前時刻自身的內部狀態,並可使用備忘錄恢復內部狀態。
Originator可以根據需要決定Memento存儲自己的哪些內部狀態。
2.Memento(備忘錄):負責存儲Originator對象的內部狀態,並可以防止Originator以外的其他對象訪問備忘錄。
備忘錄有兩個接口:Caretaker只能看到備忘錄的窄接口,他只能將備忘錄傳遞給其他對象。
Originator卻可看到備忘錄的寬接口,允許它訪問返回到先前狀態所需要的所有數據。
3.Caretaker(管理者):負責備忘錄Memento,不能對Memento的內容進行訪問或者操作。
3、使用備忘錄模式
開始上代碼 :

為什么存儲一個對象的狀態只需要存儲這個對象的屬性即可?
一個對象是由屬性和方法組成的。在對象的生命周期中,從alloc-init創建到銷毀,會不斷變化的是屬性,而行為方法仍舊還是那個行為方法。
(如果對象的方法要變,比如將飛鳥的“飛”的行為變成“游泳”,那也只能更改創建這個對象的類對應的方法,注意哦,
是通過改變類的方法而改變這個對象的方法哦,除此之外,正在活動的對象方法是不可能改變的。)
那么屬性呢?屬性肯定會變的,更何況如果銷毀了一個對象,重新alloc-init方法出來的新的對象的屬性肯定是和前一個對象不一樣。
所以綜上所述,要保存一個對象,一般只要保存這個對象的屬性狀態即可。
最后,OC一般用字典來保存對象的屬性狀態("屬性-值:key-value""字典的鍵-值對:key-value")。

接着新建一個普通的Apple類,模擬需要存儲的對象,接收協議實現相關的方法。

然后拷貝Fastcoding源碼進工程。
到這里的源代碼百度雲下載鏈接: http://pan.baidu.com/s/1gekVZmN 密碼: xcvs (該工程里的Fastcoding已經設置好了MRC模式)
另外介紹:FastCoding(第三方序列化對象工具)
1.定義: 本地序列化工具
2.優點: 普通對象直接轉換成NSData,直接存儲,效率高於NSCoding,編碼也比NSCoding好用
3.缺點:項目ARC,Fastcoding(MRC)
4.使用條件:MRC(需要用-fno-objc-arc)
在github網站里https://github.com/nicklockwood/FastCoding,可以下載到FastCoding源碼,然后拷貝進工程,最后設置好MRC即可。

為了方法實現嚴謹和安全,在代碼中使用NSParameterAssert(object); ,如果object為nil,那么這段程序就會直接使得整個應用程序崩潰。
並在MetentoCenter中使用Fastcoding和NSUserDefaults:

然后測試:
先使用MetentoCenter存儲狀態:

然后通過MetentoCenter讀取存儲的狀態:

到這里為止,源代碼百度雲下載鏈接: http://pan.baidu.com/s/1kTXWCAj 密碼: pfd9
4、優化存儲方案

優化開始,創建一個NSObject的類別:

測試代碼:

該源代碼"終結版"百度下載鏈接: http://pan.baidu.com/s/1jGWCK9C 密碼: 7hdg
5、恢復UIView的狀態
