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

首頁 > 學院 > 開發設計 > 正文

ios開發之單例模式

2019-11-14 20:08:46
字體:
來源:轉載
供稿:網友

在iOS開發中,有很多地方都選擇使用單例模式。有很多時候必須要創建一個對象,并且不能創建多個,用單例就為了防止創建多個對象。單例模式的意思就是某一個類有且只有一個實例。單例模式確保某一個類只有一個實例,而且自行實例化并向整個系統提供這個實例。這個類稱為單例類。

一、單例模式的三要點:

1. 該類有且只有一個實例;

2. 該類必須能夠自行創建這個實例;

3. 該類必須能夠自行向整個系統提供這個實例。

二、單例模式的優點與缺點:

1. 內存占用與運行時間

   對比使用單例模式和非單例模式的例子,在內存占用與運行時間存在以下差距:

   (1) 單例模式:單例模式每次獲取實例時都會先進行判斷,看該實例是否存在——如果存在,則返回;否則,則創建實例。因此,會浪費一些判斷的時間。但是,如果一直沒有人使用這個實例的話,那么就不會創建實例,節約了內存空間。

   (2) 非單例模式:當類加載的時候就會創建類的實例,不管你是否使用它。然后當每次調用的時候就不需要判斷該實例是否存在了,節省了運行的時間。但是如果該實例沒有使用的話,就浪費了內存。

  (3)實例控制:Singleton 會阻止其他對象實例化其自己的 Singleton 對象的副本,從而確保所有對象都訪問唯一實例。

   靈活性:因為類控制了實例化過程,所以類可以更加靈活修改實例化過程。

2. 線程的安全性

    (1) 從線程的安全性上來講,不加同步的單例模式是不安全的。比如,有兩個線程,一個是線程A,另外一個是線程B,如果它們同時調用某一個方法,那就可能會導致并發問題。在這種情況下,會創建出兩個實例來,也就是單例的控制在并發情況下失效了。

    (2) 非單例模式是線程安全的,因為程序保證只加載一次,在加載的時候不會發生并發情況。

    (3) 單例模式如果要實現線程安全,只需要加上synchronized即可。但是這樣一來,就會減低整個程序的訪問速度,而且每次都要判斷,比較麻煩。

    (4) 雙重檢查加鎖:為了解決(3)的繁瑣問題,可以使用“雙重檢查加鎖”的方式來實現,這樣,就可以既實現線程安全,又能使得程序性能不受太大的影響。

         (4.1) 雙重檢查加鎖機制——并不是每次進入要調用的方法都需要同步,而是先不同步,等進入了方法之后,先檢查實例是否存在,如果不存在才進入下面的同步塊,這是第一重檢查。當進入同步塊后,再次檢查實例是否存在,如果不存在,就在同步的情況下創建一個實例,這是第二重檢查。這樣一來,就只需要同步一次,從而減少了多次在同步情況下進行判斷所浪費的時間。

         (4.2) 雙重檢查加鎖機制的實現,會使用一個關鍵字volatile。它的意思是:被volatile修飾的變量的值,將不會被本地線程緩存,所有對該變量的讀寫都是直接操作共享內存的,從而確保了多個線程能正確的處理該變量。這種實現方式既可以實現線程安全地創建實例,而又不會對性能造成太大的影響。它只是在第一次創建實例的時候同步,以后就不需要同步了,從而加快了運行速度。

3. 單例模式會阻止其它對象實例化其自己的對象的副本,從而確保所有對象都訪問唯一實例。

4. 因為單例模式的類控制了實例化的過程,所以類可以更加靈活修改實例化過程。

三、iOS中的單例模式

1. 基本步驟:

   (1) 為單例對象創建一個靜態實例,可以寫成全局的,也可以在類方法里面實現,并初始化為nil;

   (2) 實現一個實例構造方法,檢查上面聲明的靜態實例是否為nil,如果是,則創建并返回一個本類的實例;

   (3) 重寫allocWithZone方法,用來保證其他人直接使用alloc和init試圖獲得一個新實力的時候不產生一個新實例;

   (4) 適當實現allocWitheZone,copyWithZone,release和autorelease。

//第一步:靜態實例,并初始化。
static SurveyRunTimeData *sharedObj = nil;
@implementation SurveyRunTimeData

//第二步:實例構造檢查靜態實例是否為nil
{
+ (SurveyRunTimeData*) sharedInstance 
    @synchronized (self)
    {
        if (sharedObj == nil)
        {
            [[self alloc] init];
        }
    }
    return sharedObj;
}

//第三步:重寫allocWithZone方法
+ (id) allocWithZone:(NSZone *)zone
{
    @synchronized (self) {
        if (sharedObj == nil) {
            sharedObj = [super allocWithZone:zone];
            return sharedObj;
        }
    }
    return nil;
}
//第四步
- (id) copyWithZone:(NSZone *)zone
{
    return self;
}

//一下方法再Xcode5以上,已經不需要!大家根據事情情況自行判斷!
- (id) retain
{
    return self;
}

- (unsigned) retainCount
{
    return UINT_MAX;
}

- (oneway void) release
{
    
}

- (id) autorelease
{
    return self;
}

- (id)init
{
    @synchronized(self) {
        [super init];//往往放一些要初始化的變量.
        return self;
    }
}

@end

+(id)allocWithZone:(NSZone *)zone{
        @synchronized(self){
                if (shareRootViewController == nil) {
                   shareRootViewController = [super allocWithZone:zone];
                    return  shareRootViewController;
                }
            }
        return nil;
}

NSZone: 簡單來說可以把它想象成一個內存池,alloc或者dealloc這些操作都是在這個內存池中操作的,cocoa總是會分配一個默認的nsZone,任何 默認內存操作都是在這個zone上進行的,使用默認zone存在缺陷,因為他是全局范圍的,頻繁使用會導致內存的碎片化,尤其是大量的alloc和 dealloc的時候,性能上會受到一定影響。因為你完全可以自己生成一個zone并將alloc,copy這些限制在這個zone中。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品入口福利| 久久综合免费视频影院| 亚洲一级黄色片| 国产欧美日韩亚洲精品| 国产亚洲在线播放| 国产精品久久一区主播| 91久久久国产精品| 国产精品视频xxx| 欧美性猛交xxxx富婆弯腰| 日韩中文字幕在线观看| 亚洲第一网中文字幕| 欧美裸体视频网站| 日韩av免费看| 国产精品劲爆视频| 欧美亚洲午夜视频在线观看| 亚洲香蕉伊综合在人在线视看| 一级做a爰片久久毛片美女图片| 亚洲a∨日韩av高清在线观看| 超碰日本道色综合久久综合| 色偷偷噜噜噜亚洲男人| 色偷偷av亚洲男人的天堂| 中文字幕日韩高清| 国产成人亚洲综合| 欧美激情中文字幕乱码免费| 精品色蜜蜜精品视频在线观看| 久久久国产精品亚洲一区| 亚洲理论片在线观看| 国产成人精品a视频一区www| 久久久亚洲欧洲日产国码aⅴ| 青青草原一区二区| 国产精自产拍久久久久久| 欧美日韩美女视频| 欧美在线不卡区| 北条麻妃在线一区二区| 正在播放亚洲1区| 91亚洲精品久久久久久久久久久久| 欧美成人精品一区二区三区| 久久激情视频免费观看| 亚洲欧美日韩一区二区在线| 精品成人久久av| 2019中文字幕在线观看| 国产精品久久久久久久久久三级| 日韩精品视频免费在线观看| 午夜美女久久久久爽久久| 国产精品69av| 成人国产精品一区| 精品国产91久久久久久老师| 久久久成人精品视频| 国产99久久精品一区二区| 国产在线不卡精品| 欧美精品一区二区三区国产精品| 色爱精品视频一区| 精品国产31久久久久久| 久热99视频在线观看| 欧美电影免费观看网站| 成人免费淫片aa视频免费| 成人信息集中地欧美| 亚洲黄色免费三级| 亚洲综合成人婷婷小说| 亚洲黄在线观看| 国产亚洲精品美女| 成人观看高清在线观看免费| 亚洲新声在线观看| 国模私拍一区二区三区| 久久久久亚洲精品成人网小说| 久久精品视频免费播放| 一区二区三区视频在线| 一区二区三区国产在线观看| 日韩精品视频中文在线观看| 91精品视频在线播放| 精品久久久久国产| 91日本在线视频| 91精品久久久久久久久久另类| 亚洲伊人一本大道中文字幕| 中文字幕精品影院| 国产成人小视频在线观看| 日韩av日韩在线观看| 日韩av在线导航| 亚洲无av在线中文字幕| 国产精品69久久久久| 色噜噜久久综合伊人一本| 日韩欧美精品免费在线| 欧美午夜美女看片| 久久精品人人爽| 中文字幕亚洲一区在线观看| 亚洲综合中文字幕68页| 精品久久久香蕉免费精品视频| 国产精品亚洲第一区| 精品国产区一区二区三区在线观看| 2019亚洲男人天堂| 日韩黄色av网站| 国产乱肥老妇国产一区二| 日av在线播放中文不卡| 精品动漫一区二区| 91午夜在线播放| 国产日韩欧美在线| 精品久久久久久久久久久久久久| 欧美一区二区三区免费视| 日韩国产在线看| 欧美日本精品在线| 国产精品成人国产乱一区| 欧美高跟鞋交xxxxxhd| 在线成人免费网站| 精品电影在线观看| 精品成人国产在线观看男人呻吟| 日本成人在线视频网址| 精品二区三区线观看| 在线电影欧美日韩一区二区私密| 一级做a爰片久久毛片美女图片| 一本色道久久88亚洲综合88| 日韩精品亚洲元码| 欧美日韩aaaa| 色噜噜国产精品视频一区二区| 日韩在线视频二区| 亚洲老板91色精品久久| 国内精品久久久| 国产精品老女人视频| 欧美综合一区第一页| 日韩精品视频在线| 亚洲片国产一区一级在线观看| 在线丨暗呦小u女国产精品| 大桥未久av一区二区三区| 国产精品久久久久久五月尺| 91欧美激情另类亚洲| 91亚洲人电影| 精品成人在线视频| 在线电影av不卡网址| 日韩在线免费高清视频| 伊是香蕉大人久久| 国产亚洲精品91在线| 91色p视频在线| 欧美中文在线免费| 自拍视频国产精品| 国产精品亚洲激情| 亚洲福利在线看| 欧美国产精品人人做人人爱| 欧美精品久久久久| 欧美日韩在线另类| 狠狠综合久久av一区二区小说| 国产亚洲在线播放| 日韩成人中文电影| 亚洲精品v欧美精品v日韩精品| 91精品国产91久久久久久久久| 色多多国产成人永久免费网站| 亚洲无限乱码一二三四麻| 国产在线不卡精品| 久久久久99精品久久久久| 国产精品福利久久久| 国产原创欧美精品| 日本欧美在线视频| 亚洲综合在线做性| 性欧美xxxx视频在线观看| 国产精品成人一区| 日韩av一区二区在线观看| 国产偷国产偷亚洲清高网站| 九九九久久久久久| 久久久精品日本| 91欧美激情另类亚洲| 亚洲精品福利免费在线观看| 国产精品美女999| 久久成年人视频| 九九视频直播综合网| 国产视频精品在线| 91日本在线观看|