最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Objective-C設(shè)計(jì)模式編程中對(duì)備忘錄模式的運(yùn)用

 更新時(shí)間:2016年03月23日 17:01:46   作者:李剛  
這篇文章主要介紹了Objective-C設(shè)計(jì)模式編程中對(duì)備忘錄模式的運(yùn)用,文中結(jié)合了Cocoa框架下應(yīng)用的實(shí)例來(lái)加以講解,需要的朋友可以參考下

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

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

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

復(fù)制代碼 代碼如下:

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

實(shí)例
添加下面兩個(gè)方法到 ViewController.m 文件:

復(fù)制代碼 代碼如下:

- (void)saveCurrentState
{
    // 當(dāng)用戶退出應(yīng)用之后再重新打開,他想要跟他之前退出時(shí)一樣的狀態(tài)
    // 退出應(yīng)用,這個(gè)時(shí)候我們需要做的是把當(dāng)前顯示的專輯存儲(chǔ)下來(lái)
    // 因?yàn)橹挥幸恍∑畔ⅲ覀兛捎?NSUserDefaults 來(lái)存儲(chǔ)信息
    [[NSUserDefaults standardUserDefaults] setInteger:currentAlbumIndex forKey:@“currentAlbumIndex”];
}

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


saveCurrentState 存儲(chǔ)當(dāng)前專輯的索引到 NSUserDefaults ─ NSUserDefaults 是一個(gè)標(biāo)準(zhǔn)數(shù)據(jù)存儲(chǔ),iOS 用來(lái)專門存放程序設(shè)置和數(shù)據(jù)。

loadPreviousState 加載這之前存儲(chǔ)的專輯索引。這不是備忘錄模式的全部,不過(guò)你已經(jīng)達(dá)到目的了。

現(xiàn)在,在 ViewController.m 里,滾動(dòng)視圖初始化之前,在 viewDidLoad 里添加下面一行:

復(fù)制代碼 代碼如下:

[self loadPreviousState];

當(dāng)程序啟動(dòng)的時(shí)候加載上一次存儲(chǔ)的狀態(tài)。但是你在哪里存儲(chǔ)程序的當(dāng)前狀態(tài)呢?你需要使用通知來(lái)做這樣的事情。當(dāng)程序進(jìn)入后臺(tái)時(shí),iOS 會(huì)發(fā)送一個(gè) UIApplicationDidEnterBackgroundNotification 通知。你可利用這個(gè)通知調(diào)用 saveCurrentState。就這么方便?

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

復(fù)制代碼 代碼如下:

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

現(xiàn)在,當(dāng)你的 app 進(jìn)入后臺(tái)運(yùn)行后,ViewController 會(huì)自動(dòng)調(diào)用 saveCurrentState 存儲(chǔ)當(dāng)前的狀態(tài)。

現(xiàn)在,添加下面代碼:

復(fù)制代碼 代碼如下:

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

這里是確保當(dāng) ViewController 被釋放時(shí),移除類的 Observer。

構(gòu)建和運(yùn)行你的 app,點(diǎn)擊到一個(gè)專輯,用 Command+Shift+H(如果你使用的是模擬器的話) 將程序在后臺(tái)運(yùn)行,然后關(guān)掉 app。重啟 app,檢查之前選擇的專輯是不是居中顯示:

2016323170032314.png (214×320)

專輯數(shù)據(jù)看起來(lái)是對(duì)的,但是正確的專輯封面確沒(méi)有居中,哪出問(wèn)題了?

這就是可選方法 initialViewIndexForHorizontalScroller 的用處!因?yàn)檫@個(gè)方法沒(méi)有被委托執(zhí)行,ViewController 在這種情況下總是會(huì)顯示默認(rèn)的第一個(gè)專輯封面。

修復(fù)這個(gè)問(wèn)題,在 ViewController.m 中添加如下代碼:

復(fù)制代碼 代碼如下:

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

現(xiàn)在 HorizontalScroller 的第一個(gè)視圖總是會(huì)被設(shè)置成 currentAlbumIndex 索引的圖片。這種方法能夠確保你的 app 有一個(gè)非常棒的用戶體驗(yàn),并且它是可恢復(fù)的。

重新運(yùn)行你的 app,滾動(dòng)專輯封面,關(guān)閉 app,然后重啟確保問(wèn)題已經(jīng)得到解決:

2016323170107827.png (214×320)

如果你查看 PersistencyManger 的初始化方法,你會(huì)注意到專輯的數(shù)據(jù)是一種硬編碼,PersistencyManger 每次創(chuàng)建,數(shù)據(jù)也會(huì)重復(fù)創(chuàng)建一次。有沒(méi)有一種更好的方法當(dāng)專輯列表被創(chuàng)建的時(shí)候就存儲(chǔ)它們呢。那么如何把專輯數(shù)據(jù)存儲(chǔ)到文件里呢?

一種選擇就是循環(huán)訪問(wèn) Album 的屬性,然后把它存儲(chǔ)在一個(gè) plist 文件里,當(dāng)需要它們的時(shí)候重新創(chuàng)建一個(gè) Album 的實(shí)例。這不是最好的選擇,這需要你在每一個(gè)類里根據(jù)不同的數(shù)據(jù)或?qū)傩詫懱囟ǖ拇a。例子,如果稍后你需要一個(gè)電影的類,里面有一些不同的屬性,存儲(chǔ)和加載這些數(shù)據(jù)你就需要寫一些新的代碼。

此外,你不能在每一個(gè)類的實(shí)例里存儲(chǔ)私有變量,因?yàn)樗麄兪遣豢稍L問(wèn)的外部類。這就是為什么蘋果要?jiǎng)?chuàng)建歸檔 (Archiving) 機(jī)制。

相關(guān)文章

  • WKWebview非全屏自動(dòng)播放h5視頻的實(shí)現(xiàn)方法(Swift、OC)

    WKWebview非全屏自動(dòng)播放h5視頻的實(shí)現(xiàn)方法(Swift、OC)

    這篇文章主要給大家介紹了關(guān)于WKWebview非全屏自動(dòng)播放h5視頻的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • iOS判斷是否越獄設(shè)備方法示例

    iOS判斷是否越獄設(shè)備方法示例

    這篇文章主要給大家介紹了關(guān)于iOS判斷是否越獄設(shè)備的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位iOS開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • IOS 解決推送本地國(guó)際化 loc-key 本地化失敗的問(wèn)題

    IOS 解決推送本地國(guó)際化 loc-key 本地化失敗的問(wèn)題

    本文主要介紹IOS 推送國(guó)際化問(wèn)題,在開發(fā) IOS 項(xiàng)目過(guò)程中對(duì)軟件的國(guó)際化有的項(xiàng)目需求是需要的,這里給大家一個(gè)示例,有需要的小伙伴可以參考下
    2016-07-07
  • IOS 靜態(tài)庫(kù)打包流程簡(jiǎn)化詳細(xì)介紹

    IOS 靜態(tài)庫(kù)打包流程簡(jiǎn)化詳細(xì)介紹

    這篇文章主要介紹了IOS 靜態(tài)庫(kù)打包流程簡(jiǎn)化詳細(xì)介紹的相關(guān)資料,開發(fā)好的靜態(tài)庫(kù)后需要手動(dòng)的合并.a文件,然后再拷貝相關(guān)的頭文件,接著把靜態(tài)庫(kù)和頭文件放在同一個(gè)文件里面打包發(fā)送給SDK的使用者,這里簡(jiǎn)化下流程,需要的朋友可以參考下
    2016-12-12
  • IOS LaunchScreen設(shè)置啟動(dòng)圖片與啟動(dòng)頁(yè)停留時(shí)間詳解

    IOS LaunchScreen設(shè)置啟動(dòng)圖片與啟動(dòng)頁(yè)停留時(shí)間詳解

    這篇文章主要介紹了IOS LaunchScreen設(shè)置啟動(dòng)圖片與啟動(dòng)頁(yè)停留時(shí)間詳解的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • iOS?Swift?Lazy?var?View失效問(wèn)題解決

    iOS?Swift?Lazy?var?View失效問(wèn)題解決

    這篇文章主要為大家介紹了iOS?Swift?Lazy?var?View失效問(wèn)題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • iOS自動(dòng)移除KVO觀察者的實(shí)現(xiàn)方法

    iOS自動(dòng)移除KVO觀察者的實(shí)現(xiàn)方法

    在 Apple 的應(yīng)用開發(fā)里 KVO 提供了一個(gè)途徑,使對(duì)象(觀察者)能夠觀察其他對(duì)象(被觀察者)的屬性,當(dāng)被觀察者的屬性發(fā)生變化時(shí),觀察者就會(huì)被告知該變化。下面這篇文章主要給大家介紹了關(guān)于iOS如何自動(dòng)移除KVO觀察者的實(shí)現(xiàn)方法,需要的朋友可以參考下。
    2017-12-12
  • iOS App設(shè)計(jì)模式開發(fā)中對(duì)interpreter解釋器模式的運(yùn)用

    iOS App設(shè)計(jì)模式開發(fā)中對(duì)interpreter解釋器模式的運(yùn)用

    這篇文章主要介紹了iOS App設(shè)計(jì)模式開發(fā)中對(duì)interpreter解釋器模式的運(yùn)用,示例為傳統(tǒng)的Objective-C寫成,需要的朋友可以參考下
    2016-04-04
  • iOS應(yīng)用開發(fā)中的文字選中操作控件UITextView用法講解

    iOS應(yīng)用開發(fā)中的文字選中操作控件UITextView用法講解

    這篇文章主要介紹了iOS應(yīng)用開發(fā)中的文字選中操作控件UITextView用法講解,代碼基于傳統(tǒng)的Objective-C語(yǔ)言,需要的朋友可以參考下
    2016-02-02
  • 詳解iOS時(shí)間選擇框

    詳解iOS時(shí)間選擇框

    這篇文章主要為大家詳細(xì)介紹了詳解iOS時(shí)間選擇框,感興趣的小伙伴們可以參考一下
    2016-03-03

最新評(píng)論

南昌市| 西平县| 青龙| 虞城县| 和平区| 神木县| 广昌县| 富裕县| 泗洪县| 乐东| 丰都县| 平顶山市| 化德县| 楚雄市| 临朐县| 托克托县| 始兴县| 抚宁县| 沅江市| 昭苏县| 叶城县| 京山县| 临夏县| 无为县| 新邵县| 迭部县| 琼结县| 清苑县| 宜兴市| 保靖县| 清丰县| 汕尾市| 兰考县| 兴宁市| 乳山市| 邵阳市| 韶山市| 金寨县| 奉贤区| 隆德县| 靖远县|