撰寫本文參考於網上的一些文章,資料,文檔。
關於 物件導向的設計模式
對於物件導向的設計模式,想必大家並不陌生吧。
縱觀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