Object-C 中實現 Singleton (單例) 模式

來源:互聯網
上載者:User

撰寫本文參考於網上的一些文章,資料,文檔。

關於 物件導向的設計模式

對於物件導向的設計模式,想必大家並不陌生吧。

縱觀23種設計模式中,數單例模式(Singleton)和原廠模式(Factory
Method)最為熟悉和基礎吧。當然,本文總結Singleton模式,對於其他設計模式不做敘說。

Singleton模式,即單例模式。顧名思義,主要用於做應用程式的資源共用控制。用途很多⋯⋯

實質為,單例是在程式聲明周期裡 有且僅有 被執行個體化過一次的類。為確保執行個體化的唯一,利用類的 類(static)方法來產生和訪問對象。

至此,你便可以在程式中任何地方訪問類的單例對象,因為只執行個體化唯一的一次,所以,並不用 alloc、init、autorelease初始化方法。

Singleton 模式的實現

在objective-C中,實現Singleton模式,只需實現以下四個步驟:

1.  為 Singleton Object 實現一個靜態執行個體,並初始化,然後設定成nil;

2. 實現一個執行個體構造方法 (通常命名為 sharedInstance 或者 sharedManager) 檢查上面聲明的靜態執行個體是否為nil,如果是,則建立並返回一個本類執行個體;

3. 重寫allocWithZone: 方法,用來保證當其他人直接使用 alloc 和init 試圖獲得一個新執行個體的時候,不會產生一個新的執行個體。

4. 適當地實現  allocWithZone,  copyWithZone,  release 和 autorelease。

Sinleton.h 標頭檔

////  Singleton.h//  singleton////  Created by leondun on 11-4-20.//  Copyright 2011 leondun. All rights reserved.// #import <Foundation/Foundation.h>  @interface Singleton : NSObject { } +(Singleton *)sharedInstanceMethod; @end


Singleton.m 實現檔案

#import "Singleton.h" static Singleton * sharedInstance = nil; @implementation Singleton //擷取單例+(Singleton *)sharedInstanceMethod{    @synchronized(self) {        if (sharedInstance == nil)        sharedInstance = [[self alloc] init];        }    }    return sharedInstance;} //唯一一次alloc單例,之後均返回nil+ (id)allocWithZone:(NSZone *)zone{    @synchronized(self) {        if (sharedInstance == nil) {            instance = [super allocWithZone:zone];            return instance;        }    }    return nil;} //copy返回單例本身- (id)copyWithZone:(NSZone *)zone{    return self;} //retain返回單例本身- (id)retain{    return self;} //引用計數總是為1- (unsigned)retainCount{    return 1;} //release不做任何處理- (void)release{   } //autorelease返回單例本身- (id)autorelease{    return self;} //-(void)dealloc{      [super dealloc];} @end

部分代碼說明:

1.
synchronized   這個主要是考慮多線程的程式,這個指令可以將{ } 內的代碼限制在一個線程執行,如果某個線程沒有執行完,

其他的線程如果需要執行就得等著。

2. allocWithZone
這個是重載的,因為這個是從制定的記憶體地區讀取資訊建立執行個體,所以如果需要的單例已經有了,

就需要禁止修改當前單例,所以返回
nil。

3.allocWithZone、copyWithZone
與 NSZone為何物?

簡單來說,可以想象成一個記憶體池,alloc或者dealloc這些操作,等是在這個記憶體池中操作的。Cocoa
總是會分配 一個預設的NSZone,

任何預設的記憶體操作都是在這個“Zone”上進行的。

使用預設的NSZone存在缺陷,因為它是全域範圍的,頻繁使用過多,必然會導致記憶體的片段化。尤其是用到大量的alloc
和dealloc時,

效能上就會收到一定的影響。為此,你完全可以自己產生一個NSZone,並將alloc,copy等全部限制在一個“Zone”中。

注意:在此並未考慮到 安全執行緒問題,

1.Singleton本身是否安全執行緒。

2.Singleton的執行個體是否安全執行緒。

在此並不討論區對話安全問題,點到為止。

如若想進一步瞭解Singleton設計模式安全執行緒問題,請您手指將滑鼠箭頭滑至此連結:點擊開啟連結

http://www.nowamagic.net/librarys/veda/detail/921

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.