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

舉例講解設(shè)計(jì)模式中的原型模式在iOS應(yīng)用開發(fā)中的作用

 更新時(shí)間:2016年04月06日 10:57:32   作者:塵絮緣12138  
這篇文章主要介紹了設(shè)計(jì)模式中的原型模式在iOS應(yīng)用開發(fā)中的作用,示例代碼為傳統(tǒng)的Objective-C,需要的朋友可以參考下

1 前言
在許多面向?qū)ο蟮膽?yīng)用程序中,有些對(duì)象的創(chuàng)建代價(jià)過于大或者過于復(fù)雜。要是可以重建相同的對(duì)象并作輕微的改動(dòng),事情會(huì)容易許多。我們可以通過輕微的改動(dòng)重用已有的對(duì)象,以適應(yīng)程序中的特定情況。今天我們就來學(xué)習(xí)一下該模式。

2 詳述
2.1 定義
應(yīng)用于“復(fù)制”操作的模式成為原型(Prototype)模式。復(fù)制(cloning)指用同一模具生產(chǎn)一系列的產(chǎn)品。模具所基于的物品稱為原型。盡管產(chǎn)品是用同一模具復(fù)制的,但是某些屬性,如顏色與尺寸,可以稍有不同,但是他們還是屬于同一類。
2.2 何時(shí)是用原型模式
(1)需要?jiǎng)?chuàng)建的對(duì)象應(yīng)獨(dú)立于其類型與創(chuàng)建方式。
(2)要實(shí)例化的類是在運(yùn)行時(shí)決定的。
(3)不想要與產(chǎn)品層次相對(duì)應(yīng)的工廠層次。
(4)不同類的實(shí)例間的差異僅是狀態(tài)的若干組合。因此復(fù)制相應(yīng)數(shù)量的原型比手工實(shí)例化更加方便。
(5)類不容易創(chuàng)建,比如每個(gè)組件可以把其他組件作為子節(jié)點(diǎn)的組合對(duì)象。復(fù)制已有的組合對(duì)象并對(duì)副本進(jìn)行修改會(huì)更加容易。
此模式的最低限度是生成對(duì)象的真實(shí)副本,以用作同一環(huán)境下其他相關(guān)事物的基礎(chǔ)(原型)。
2.3 淺復(fù)制與深復(fù)制
深復(fù)制就是開辟新內(nèi)存實(shí)現(xiàn)真正的內(nèi)存復(fù)制, 淺復(fù)制, 只復(fù)制指針, 堆內(nèi)存不變. 在我們?cè)O(shè)計(jì)系統(tǒng)時(shí), 有時(shí)一些對(duì)象需要根據(jù)用戶操作完成拷貝備份等操作, 這時(shí)候, 如果再去按照原來的方法初始化一遍對(duì)象就會(huì)帶來一些不便和問題:
(1)該對(duì)象的某些屬性是在用戶操作過程中產(chǎn)生的, 不能夠僅憑一個(gè)initXXX方法賦值;
(2)常規(guī)賦值太過麻煩, 而且破壞封裝.
這時(shí)候原型模式的優(yōu)勢(shì)便體現(xiàn)出來了。

3.Demo
首先創(chuàng)建一個(gè)Player類, 擁有2個(gè)屬性highestLevel和currentLevel, 同時(shí)提供2個(gè)public方法修改這2個(gè)屬性. 代碼如下:

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

@interface Player : NSObject <NSCopying>
/**
 *  update player's current level during game
 *
 *  @param level
 */
- (void)updateCurrentLevel:(NSInteger)level;


/**
 *  update player's highest level during game
 *
 *  @param level
 */
- (void)updateHighestLevel:(NSInteger)level;

@end


最為關(guān)鍵的是Player需要實(shí)現(xiàn)NSCopying協(xié)議:
復(fù)制代碼 代碼如下:

#pragma mark - Override
- (instancetype)copyWithZone:(NSZone *)zone
{
    Player *copyPlayer = [[[self class] allocWithZone:zone] init];
    copyPlayer.highestLevel = self.highestLevel;
    copyPlayer.currentLevel = self.currentLevel;

    return copyPlayer;
}


這里大家看到NSZone類型, 這是個(gè)什么類型呢? 其實(shí)它是一個(gè)結(jié)構(gòu)體, 是為了防止內(nèi)存碎片化而引入的一個(gè)結(jié)構(gòu). NSZone會(huì)根據(jù)你想要開辟的內(nèi)存大小來分配內(nèi)存, 提高內(nèi)存管理. 然而官方的Programming with ARC Release Note也指出, 目前的runtime系統(tǒng)忽略了區(qū)域的概念,因?yàn)楸旧淼膬?nèi)存管理已經(jīng)非常有效率,使用Zone反而會(huì)降低內(nèi)存使用,訪問效率, 增加源代碼復(fù)雜度等.所以一般不使用NSZone, 而在這個(gè)例子中, 雖說使用了allocWithZone的方法, 但是我們進(jìn)去看源代碼則會(huì)發(fā)現(xiàn): Apple其實(shí)還是用一般的初始化方法代替了原來的Zone開辟:
復(fù)制代碼 代碼如下:

#pragma mark - Override
- (instancetype)copyWithZone:(NSZone *)zone
+ (instancetype)allocWithZone:(struct _NSZone *)zone OBJC_SWIFT_UNAVAILABLE("use object        
  initializers instead");

原型設(shè)計(jì)模式基本就是這些, 當(dāng)然我們的Player類可以變成一個(gè)接口, 讓子類去實(shí)現(xiàn), 更好的體現(xiàn)面向接口編程.

結(jié)果:

2015-09-18 21:30:32.072 DP_Prototype[1173:280693] <Player: 0x14d513f60>
2015-09-18 21:30:32.073 DP_Prototype[1173:280693] <Player: 0x14d5337e0>

在其他文件調(diào)用copy方法, 即可看到系統(tǒng)為我們新開辟的一塊內(nèi)存, 引用計(jì)數(shù)為1.

4.Cocoa Touch框架中的對(duì)象復(fù)制
CocoaTouch框架為NSObject的派生類提供了實(shí)現(xiàn)深復(fù)制的協(xié)議。NSObject的子類需要實(shí)現(xiàn)NSCopying協(xié)議及其方法--(id)copyWithZone:(NSZone *)zone。NSObject有一個(gè)實(shí)例方法叫做(id)copy。默認(rèn)的copy方法調(diào)用[selfcopyWithZone:nil]。對(duì)于采納了NSCopying協(xié)議的子類,需要實(shí)現(xiàn)這個(gè)方法,否則將引發(fā)異常。IOS中,這個(gè)方法保持新的副本對(duì)象,然后將其返回。此方法的調(diào)用者需要負(fù)責(zé)釋放返回的對(duì)象。
深復(fù)制的技巧在于:保證確實(shí)復(fù)制了內(nèi)存中的資源,而不只是指指針。


相關(guān)文章

  • iOS開發(fā)中常見的項(xiàng)目文件與MVC結(jié)構(gòu)優(yōu)化思路解析

    iOS開發(fā)中常見的項(xiàng)目文件與MVC結(jié)構(gòu)優(yōu)化思路解析

    這篇文章主要介紹了iOS開發(fā)中常見的項(xiàng)目文件與MVC結(jié)構(gòu)優(yōu)化思路解析,示例代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下
    2015-12-12
  • iOS touch事件區(qū)分單擊雙擊響應(yīng)的方法

    iOS touch事件區(qū)分單擊雙擊響應(yīng)的方法

    如果您的 iPhone 應(yīng)用里有個(gè) view,既有單擊操作又有雙擊操作。用戶雙擊 view 時(shí),總是先執(zhí)行一遍單擊的操作再執(zhí)行雙擊的操作。所以直接判斷時(shí)就會(huì)發(fā)現(xiàn)不能直接進(jìn)入雙擊操作。下面是區(qū)分 touch 事件是單擊還是雙擊的方法,需要的朋友可以參考下
    2016-10-10
  • H5混合開發(fā)IOS中遇到的坑

    H5混合開發(fā)IOS中遇到的坑

    本篇文章主要給大家講述了在用H5混合開發(fā)APP時(shí),IOS項(xiàng)目中遇到的坑以及解決辦法,需要的朋友參考一下吧。
    2017-12-12
  • iOS仿微博導(dǎo)航欄動(dòng)畫(CoreGraphics)的實(shí)現(xiàn)方法

    iOS仿微博導(dǎo)航欄動(dòng)畫(CoreGraphics)的實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于iOS仿微博導(dǎo)航欄動(dòng)畫(CoreGraphics)的實(shí)現(xiàn)方法,文章最后給出了完整的示例代碼,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • iOS tableView上拉刷新顯示下載進(jìn)度的問題及解決辦法

    iOS tableView上拉刷新顯示下載進(jìn)度的問題及解決辦法

    這篇文章主要介紹了 iOS tableView上拉刷新顯示下載進(jìn)度的問題及解決辦法,需要的朋友可以參考下
    2017-03-03
  • iOS 頁面滑動(dòng)與標(biāo)題切換顏色漸變的聯(lián)動(dòng)效果實(shí)例

    iOS 頁面滑動(dòng)與標(biāo)題切換顏色漸變的聯(lián)動(dòng)效果實(shí)例

    本篇文章主要介紹了iOS 頁面滑動(dòng)與標(biāo)題切換顏色漸變的聯(lián)動(dòng)效果實(shí)例,具有一定的參考價(jià)值,有興趣的可以了解一下。
    2017-04-04
  • iOS中的AutoLayout使用實(shí)踐總結(jié)

    iOS中的AutoLayout使用實(shí)踐總結(jié)

    在對(duì)界面進(jìn)行布局的時(shí)候,我們經(jīng)常使用AutoLayout對(duì)界面進(jìn)行布局適配。下面這篇文章主要給大家介紹了iOS中AutoLayout使用實(shí)踐的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-12-12
  • iOS Gif圖片展示N種方式(原生+第三方)

    iOS Gif圖片展示N種方式(原生+第三方)

    這篇文章主要介紹了iOS Gif圖片展示N種方式,包括原生、第三方方式展示,感興趣的小伙伴們可以參考一下
    2016-03-03
  • iOS如何將圖片裁剪成圓形

    iOS如何將圖片裁剪成圓形

    這篇文章主要為大家詳細(xì)介紹了iOS如何將圖片裁剪成圓形,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • iOS實(shí)現(xiàn)圓角箭頭矩形的提示框

    iOS實(shí)現(xiàn)圓角箭頭矩形的提示框

    不知道大家發(fā)現(xiàn)了沒,在現(xiàn)在的很多App中常使用圓角箭頭矩形, 如微博分組提示框, 地圖坐標(biāo)顯示點(diǎn)等。iPad 中有 UIPopoverController 類供開發(fā)使用, iPhone中就需要開發(fā)人員定制了。那么下面這篇文中就來聊聊定制圓角箭頭矩形提示框,有需要的朋友們可以參考借鑒。
    2016-11-11

最新評(píng)論

恩施市| 平乐县| 颍上县| 收藏| 阿克苏市| 丹阳市| 奉新县| 桂林市| 义马市| 得荣县| 兖州市| 晋城| 江安县| 仪陇县| 吉林省| 霍城县| 互助| 荣成市| 柯坪县| 鹤岗市| 吉首市| 庆城县| 柏乡县| 凤城市| 曲阜市| 孝昌县| 肇庆市| 邢台县| 海兴县| 吉木萨尔县| 含山县| 牙克石市| 凤城市| 体育| 荣昌县| 济南市| 双鸭山市| 洮南市| 通道| 阿拉善右旗| 衢州市|