單例模式是iOS經常使用設計模式中的一種。單例設計模式的做用是使得這個類的一個對象成爲 系統中的惟一實例,所以須要用一種惟一的方法去建立這個對象並返回這個對象的地址。那麼,咱們什麼時候使用單例模式呢?一、類只能有一個實例,並且必須從一個 爲人熟知的訪問點對其訪問。二、這個惟一的實例只能經過子類化進行擴展,並且擴展的對象不會破壞客戶端代碼。程序員
那麼用Objective-C如何實現單例模式呢?下面咱們來新建一個Singleton類,在Singleton.h中實現以下設計模式
- @interface Singleton : NSObject
-
- + (Singleton *) sharedInstance;
-
- @end
在Singleton.m函數
- @implementation Singleton
-
- static Singleton * sharedSingleton = nil;
-
- + (Singleton *) sharedInstance
- {
- if (sharedSingleton == nil) {
- sharedSingleton = [[Singleton alloc] init];
- }
- return sharedSingleton;
- }
-
- @end
這樣就建立一個簡單的單例模式,實際上有一部分程序員也是這樣實現的,但實際上這是一個不「嚴格」版本,在實際中使用,可能 會遇到發起調用的對象不能以其餘分配方式實例化單例對象,不然,就會建立多個實例。(以前有人和我討論過這個問題,說使用者應該嚴格按照接口來使用,當實 際上Singleton是一個對象,咱們不能保證使用者不會使用其餘的方法去建立(好比alloc),這個時候他就會建立多個實例,這樣就會出現這些沒法 感知的bug)post
下面我對Singleton.m的進行改進spa
- @implementation Singleton
-
- static Singleton * sharedSingleton = nil;
-
- + (Singleton *) sharedInstance
- {
- if (sharedSingleton == nil) {
- sharedSingleton = [[super allocWithZone:NULL] init];
- }
- return sharedSingleton;
- }
-
- + (id) allocWithZone:(struct _NSZone *)zone
- {
- return [[self sharedInstance] retain];
- }
-
- - (id) copyWithZone:(NSZone *) zone
- {
- return self;
- }
-
- - (id) retain
- {
- return self;
- }
-
- - (NSUInteger) retainCount
- {
- return NSUIntegerMax;
- }
-
-
- - (void) release
- {
-
- }
-
- - (id) autorelease
- {
- return self;
- }
-
- @end
也許你注意到了,我重載了allocWithZone:,保持了從sharedInstance方法返回的單例對象,使用者哪怕使用 alloc時也會返回惟一的實例(alloc方法中會先調用allocWithZone:建立對象)。而retain等內存管理的函數也被重載了,這樣作 讓咱們有了把Singleton類變得「嚴格」了。設計