亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

詳解Objective-C設計模式編程中對備忘錄模式的運用

2020-07-26 03:24:57
字體:
來源:轉載
供稿:網友

基本理解
這個模式有三個關鍵角色:原發器(Originator)、備忘錄(Memento)、看管人(caretaker)。三者的基本關系是:原發器創建一個包含其狀態的備忘錄,并傳給看管人??垂苋瞬恢廊绾闻c備忘錄交互,但會把備忘錄放在一個安全之處保管好。
備忘錄(Memento):在 不破壞封裝性的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態。這樣以后就可以將該對象回復到原先保存的狀態。
Originator(發起人):負責創建一個備忘錄,用以記錄當前時刻它的內部狀態,并且可使用恢復備忘錄內部狀態。Originator可根據需要決定Memento存儲Originator的哪些內部狀態。
Memento(備忘錄):負責存儲Originator對象的內部狀態,并可防止Originator以外的其他對象訪問備忘錄。備忘錄有兩個接口,CareTaker
只能看到備忘錄的窄接口,它只能將備忘錄傳給其他對象。originator能夠看到一個寬接口,允許它訪問返回到先前狀態所需的所有數據。
Caretaker(管理者):負責保存好備忘錄,不能對備忘錄的內容進行操作或檢查。
就是把要保存的細節給封裝在了Memento中,哪一天要更改保存的細節也不用影響客戶端了。

備忘錄使用場合
備忘錄模式比較適用于功能比較復雜的,但需要維護或記錄屬性歷史的類,或者需要保存的屬性只是眾多屬性中的一小部分時,Orignator可以根據保存的Memento信息還原到前一狀態。
如果在某個系統中使用命令模式時,需要實現命令的撤銷功能,那么命令模式可以使用備忘錄模式來存儲撤銷操作的狀態。有的時候一些對象的內部信息必須要保存在對象以外的地方,但是必須要由對象自己讀取,這時,使用備忘錄可以把復雜的對象內部信息對其他的對象屏蔽起來。
用于獲取狀態的接口會暴露實現接口,需要將其屏蔽起來。
它一般應用于游戲、文字處理程序的設計中,這種程序需要保存當前上下文的復雜狀態的快照并在以后恢復處理。

作用
當角色的狀態改變時,有可能這個狀態無效,這時候就可以使用暫時存儲起來的備忘錄將狀態復原。
Cocoa Touch框架中的備忘錄模式
Cocoa Touch框架在歸檔、屬性列表序列化和核心數據采用了備忘錄模式。
Cocoa的歸檔是對對象以及其屬性還有同其他對象間的關系進行編碼,形成一個文檔,該文檔既可保存與文件系統中,也可在進程或網絡間傳送。對象與其他對象的關系被看做對象圖的網絡。
歸檔過程把對象保存為一種與架構無關的字節流,保持對象的標識以及對象之間的關系。對象的類型也同數據一起保存。從字節流解碼出來的對象通常用于對象編碼時相同的類進行實例化。使用NSCoder的具體類NSKeyedArchiver和NSKeyedUnarchiver,使用基于鍵的歸檔技術,被編碼與解碼的對象必須遵守NSCoding協議并實現以下方法:

復制代碼 代碼如下:

-(id)initWithCoder:(NSCoder *)coder;
-(void)encodeWithCoder:(NSCoder *)coder;

實例
添加下面兩個方法到 ViewController.m 文件:

復制代碼 代碼如下:

- (void)saveCurrentState
{
    // 當用戶退出應用之后再重新打開,他想要跟他之前退出時一樣的狀態
    // 退出應用,這個時候我們需要做的是把當前顯示的專輯存儲下來
    // 因為只有一小片信息,我們可用 NSUserDefaults 來存儲信息
    [[NSUserDefaults standardUserDefaults] setInteger:currentAlbumIndex forKey:@“currentAlbumIndex”];
}

- (void)loadPreviousState
{
    currentAlbumIndex = [[NSUserDefaults standardUserDefaults] integerForKey@“currentAlbumIndex”];
    [self showDataForAlbumAtIndex:currentAlbumIndex];
}


saveCurrentState 存儲當前專輯的索引到 NSUserDefaults ─ NSUserDefaults 是一個標準數據存儲,iOS 用來專門存放程序設置和數據。

loadPreviousState 加載這之前存儲的專輯索引。這不是備忘錄模式的全部,不過你已經達到目的了。

現在,在 ViewController.m 里,滾動視圖初始化之前,在 viewDidLoad 里添加下面一行:

復制代碼 代碼如下:

[self loadPreviousState];

當程序啟動的時候加載上一次存儲的狀態。但是你在哪里存儲程序的當前狀態呢?你需要使用通知來做這樣的事情。當程序進入后臺時,iOS 會發送一個 UIApplicationDidEnterBackgroundNotification 通知。你可利用這個通知調用 saveCurrentState。就這么方便?

在 viewDidLoad: 最后面添加下面一行

復制代碼 代碼如下:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(saveCurrentState) name:UIApplicationDidEnterBackgroundNotification object:nil];

現在,當你的 app 進入后臺運行后,ViewController 會自動調用 saveCurrentState 存儲當前的狀態。

現在,添加下面代碼:

復制代碼 代碼如下:

- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

這里是確保當 ViewController 被釋放時,移除類的 Observer。

構建和運行你的 app,點擊到一個專輯,用 Command+Shift+H(如果你使用的是模擬器的話) 將程序在后臺運行,然后關掉 app。重啟 app,檢查之前選擇的專輯是不是居中顯示:

2016323170032314.png (214×320)

專輯數據看起來是對的,但是正確的專輯封面確沒有居中,哪出問題了?

這就是可選方法 initialViewIndexForHorizontalScroller 的用處!因為這個方法沒有被委托執行,ViewController 在這種情況下總是會顯示默認的第一個專輯封面。

修復這個問題,在 ViewController.m 中添加如下代碼:

復制代碼 代碼如下:

- (NSInteger)initialViewIndexForHorizontalScroller:(HorizontalScroller *)scroller
{
    return currentAlbumIndex;
}

現在 HorizontalScroller 的第一個視圖總是會被設置成 currentAlbumIndex 索引的圖片。這種方法能夠確保你的 app 有一個非常棒的用戶體驗,并且它是可恢復的。

重新運行你的 app,滾動專輯封面,關閉 app,然后重啟確保問題已經得到解決:

2016323170107827.png (214×320)

如果你查看 PersistencyManger 的初始化方法,你會注意到專輯的數據是一種硬編碼,PersistencyManger 每次創建,數據也會重復創建一次。有沒有一種更好的方法當專輯列表被創建的時候就存儲它們呢。那么如何把專輯數據存儲到文件里呢?

一種選擇就是循環訪問 Album 的屬性,然后把它存儲在一個 plist 文件里,當需要它們的時候重新創建一個 Album 的實例。這不是最好的選擇,這需要你在每一個類里根據不同的數據或屬性寫特定的代碼。例子,如果稍后你需要一個電影的類,里面有一些不同的屬性,存儲和加載這些數據你就需要寫一些新的代碼。

此外,你不能在每一個類的實例里存儲私有變量,因為他們是不可訪問的外部類。這就是為什么蘋果要創建歸檔 (Archiving) 機制。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
美乳少妇欧美精品| 在线观看日韩av| 欧美大片大片在线播放| 91精品久久久久久久久中文字幕| 欧美久久精品一级黑人c片| 精品夜色国产国偷在线| 欧美激情中文字幕在线| 欧美怡春院一区二区三区| 日日噜噜噜夜夜爽亚洲精品| 国内精品视频在线| 成人av在线亚洲| 日韩中文字幕av| 久久久久久久国产| 亚洲免费av片| 欧美乱妇40p| 日韩精品中文字幕视频在线| 日本人成精品视频在线| 精品国产鲁一鲁一区二区张丽| 久热精品在线视频| 午夜免费日韩视频| 欧美性猛交xxxx富婆| 日韩中文字幕不卡视频| 亚洲欧美日韩网| 亚洲新声在线观看| 亚洲福利精品在线| 伊人青青综合网站| 亚洲性日韩精品一区二区| 亚洲一区二区三区久久| 日韩av手机在线| 国产精品福利观看| 中文字幕日韩av综合精品| 欧美国产日韩一区二区| 尤物99国产成人精品视频| 久久久日本电影| 国产精品91一区| 欧美最顶级的aⅴ艳星| 久久久亚洲福利精品午夜| 欧美精品xxx| 久久精品99久久久久久久久| 热久久这里只有精品| 国产精品老女人视频| 中文国产亚洲喷潮| 亚洲精品视频网上网址在线观看| 97久久精品视频| 91成人在线观看国产| 美女性感视频久久久| 国产精品久久久久久av下载红粉| 一本色道久久综合狠狠躁篇的优点| 久久99国产综合精品女同| 欧美成人精品激情在线观看| 欧美午夜片在线免费观看| 亚洲国产精品久久久| 欧美午夜精品在线| 久久国产精品视频| 91美女高潮出水| 日韩在线中文视频| 视频一区视频二区国产精品| 成人黄色av网| 欧美与黑人午夜性猛交久久久| 亚洲精品资源美女情侣酒店| 久久视频国产精品免费视频在线| 色悠悠国产精品| 亚洲精品一区二区在线| 亚洲精品一区二区三区婷婷月| 亚洲电影成人av99爱色| 久久精品国产精品| 精品国产91乱高清在线观看| 欧美老女人在线视频| 久久国产加勒比精品无码| 欧美噜噜久久久xxx| 亚洲夜晚福利在线观看| 欧美激情二区三区| 国产香蕉精品视频一区二区三区| 久久香蕉国产线看观看网| 国产精品白丝jk喷水视频一区| 亚洲欧洲国产一区| 日韩成人中文字幕在线观看| 亚洲а∨天堂久久精品喷水| 91在线观看免费高清完整版在线观看| 成人a在线视频| 欧美激情一级精品国产| 国产日韩欧美中文| 国产精品一区专区欧美日韩| 亚洲欧美福利视频| 亚洲大胆人体视频| 日韩中文字幕在线播放| 国产精品女主播视频| 国产精品视频xxxx| 热re99久久精品国产66热| 国产精品黄色av| 国产婷婷成人久久av免费高清| 欧美成人一区二区三区电影| 蜜臀久久99精品久久久无需会员| 亚洲激情视频在线播放| 国产欧美日韩最新| 91精品视频在线看| 亚洲精品v欧美精品v日韩精品| 精品视频久久久| 成人网在线视频| 欧美xxxx14xxxxx性爽| 久久视频在线直播| 久久久精品网站| 日韩精品免费在线| 亚洲一区中文字幕在线观看| 亚洲国产精品美女| 国产一区二中文字幕在线看| 亚洲黄色在线看| 成人黄色生活片| 国产主播在线一区| 久久久免费精品| 国产午夜精品免费一区二区三区| 国产精品久久99久久| 高清一区二区三区日本久| 成人午夜在线观看| 亚洲第一精品夜夜躁人人躁| 亚洲美女黄色片| 亚洲精品aⅴ中文字幕乱码| 亚洲福利视频免费观看| 国产日韩在线精品av| 亚洲国产精品国自产拍av秋霞| 热re99久久精品国产66热| 国产精品99免视看9| 国产精品手机播放| 亚洲国产精品人久久电影| 欧美亚洲成人免费| 亚洲日本欧美日韩高观看| 日韩成人中文电影| 在线观看欧美日韩国产| 精品国产欧美一区二区三区成人| 97国产在线视频| 成人久久久久久| 国产精品99久久久久久人| 亚洲人成在线免费观看| 国产精品最新在线观看| 欧美猛男性生活免费| 精品久久久久久中文字幕一区奶水| 亚洲**2019国产| 隔壁老王国产在线精品| 少妇久久久久久| 欧美激情性做爰免费视频| 亚洲国产高清自拍| 九九热在线精品视频| 成人国内精品久久久久一区| 亚洲欧美在线免费观看| 亚洲级视频在线观看免费1级| 日韩免费视频在线观看| 欧亚精品在线观看| 日韩av在线免费观看| 久久久久久久一区二区三区| 亚洲女人天堂视频| 久久久久久久影视| 日韩av电影手机在线观看| 欧美激情视频三区| 欧美综合在线第二页| 日韩av资源在线播放| 亚洲男人天堂2023| 久久精品亚洲精品| 亚洲男人天堂2019| 亚洲欧美一区二区精品久久久| 久久精品影视伊人网| 国产精品稀缺呦系列在线| 色哟哟入口国产精品| 午夜欧美大片免费观看| 国产日产欧美a一级在线|