欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

舉例講解設計模式中的原型模式在iOS應用開發(fā)中的作用

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

1 前言
在許多面向對象的應用程序中,有些對象的創(chuàng)建代價過于大或者過于復雜。要是可以重建相同的對象并作輕微的改動,事情會容易許多。我們可以通過輕微的改動重用已有的對象,以適應程序中的特定情況。今天我們就來學習一下該模式。

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

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

復制代碼 代碼如下:

@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


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

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

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

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

結果:

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>

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

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


相關文章

  • iOS 中Swift仿微信添加提示小紅點功能(無數(shù)字)

    iOS 中Swift仿微信添加提示小紅點功能(無數(shù)字)

    這篇文章主要介紹了iOS 中Swift仿微信添加提示小紅點功能(無數(shù)字),非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-05-05
  • IOS開發(fā)之路--C語言基礎知識

    IOS開發(fā)之路--C語言基礎知識

    當前移動開發(fā)的趨勢已經(jīng)勢不可擋,這個系列希望淺談一下個人對IOS開發(fā)的一些見解,今天我們從最基礎的C語言開始,C語言部分我將分成幾個章節(jié)去說,今天我們簡單看一下C的一些基礎知識,更高級的內容我將放到后面的文章中。
    2014-08-08
  • IOS視圖控制器的生命周期實例詳解

    IOS視圖控制器的生命周期實例詳解

    這篇文章主要介紹了IOS視圖控制器的生命周期實例詳解的相關資料,需要的朋友可以參考下
    2017-04-04
  • IOS 長鏈接與短鏈接之間的轉換

    IOS 長鏈接與短鏈接之間的轉換

    這篇文章主要介紹了IOS 長鏈接與短鏈接之間的轉換的相關資料,需要的朋友可以參考下
    2017-06-06
  • IOS判斷字符串是不是純數(shù)字的方法總結

    IOS判斷字符串是不是純數(shù)字的方法總結

    這篇文章給大家分享了在IOS中判斷字符串是不是純數(shù)字的三種方法,大家可以根據(jù)自己的需求來選擇對應的方法實現(xiàn),有需要的朋友們可以參考借鑒,下面來看看。
    2016-09-09
  • iOS在頁面銷毀時如何優(yōu)雅的cancel網(wǎng)絡請求詳解

    iOS在頁面銷毀時如何優(yōu)雅的cancel網(wǎng)絡請求詳解

    這篇文章主要給大家介紹了關于iOS在頁面銷毀時如何優(yōu)雅的cancel網(wǎng)絡請求的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-05-05
  • iOS中排列組合算法的使用小結

    iOS中排列組合算法的使用小結

    這篇文章主要給大家介紹了關于iOS中排列組合算法使用的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-09-09
  • iOS中如何獲取某個視圖的截圖詳析

    iOS中如何獲取某個視圖的截圖詳析

    這篇文章主要給大家介紹了關于在iOS中如何獲取某個視圖的截圖的相關資料,文中通過示例代碼介紹的非常詳細,對各位iOS開發(fā)者們有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-07-07
  • 零基礎學習iOS直播之播放

    零基礎學習iOS直播之播放

    對于直播來說,客戶端主要做兩件事情,推流和播放。本篇主要對播放進行詳細介紹,需要的朋友一起來看下吧
    2016-12-12
  • MacOS系統(tǒng)下Unity啟動黑屏的解決方法

    MacOS系統(tǒng)下Unity啟動黑屏的解決方法

    最近發(fā)現(xiàn)了一個問題,unity一打開就黑屏,通過查找相關的資料終于解決了,所以下面這篇文章主要給大家介紹了關于在MacOS系統(tǒng)下Unity啟動黑屏的解決方法,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。
    2018-01-01

最新評論