1. 程式人生 > >iOS設計模式之單例模式

iOS設計模式之單例模式

trac 實例 配方 implement 字節數 bsp 變量 auto ==

單例模式:總是返回自己的同一個實例,它提供了對類的對象所提供的資源的全局訪問點,而且返回的實例僅僅能被實例化一次.

單例設計模式設計須要考慮的兩個問題:

(1) :發起調用的對象不能以其它分配方式實例化單例對象,否則,就有可能創建單例類的多個實例

(2) :對單例對象實例化的限制應該與引用計數內存模型共存.


Singleton.h

#import <Foundation/Foundation.h>


@interface Singleton : NSObject


+(Singleton

*) sharedInstance;


@end


Singleton.m

#import "Singleton.h"


@implementation Singleton


static Singleton *sharedSingleton = nil;


+(Singleton *) sharedInstance{

if (sharedSingleton == nil) {

//sharedSingleton = [[Singleton alloc] init];

// --------->>>>>(1)

//sharedSingleton = [[super allocWithZone:NULL] init];

/*

這裏使用 super而不適用self的原因是self已經重載了allocWithZone方法

所以通過調用父類的方法,實現內存的分配

事實上allocWithZone方法內部調用的是NSAllocateObject方法

*/

// --------->>>>>(2)

sharedSingleton = [NSAllocateObject([self class], 0, NULL) init];

/*

第一個參數是 類的類型

第二個參數是 用於索引的實例變量的額外字節數,總是 0

第三個參數是 用於指定內存中分配的區域,一般為NULL,表示為默認區域

這裏不適用(1)而使用(2)的原因是處理無論是實例化Singleton還是子類,都適用

*/

}

return sharedSingleton;

}



/*

調用類的allocWithZone傳入NSZone參數,為即將產生的新對象分配空間

重載的目的是當使用對象的alloc方法時不會產生新的實例

由於 alloc方法事實上調用的就是 allocWithZone:NULL方法,防止因 alloc而產生其它的實例

*/

+(id) allocWithZone:(struct _NSZone *)zone{


return [[self sharedInstance] retain];

}



/*

這裏重載copyWithZone的目的,是防止使用 copy 方法時產生其它的實例

*/

-(id) copyWithZone:(NSZone *)zone{

return self;


}


-(id) retain{

return self;

}


-(NSUInteger) retainCount{

return NSUIntegerMax;

}


-(void) release{

//什麽也不做


}


-(id) autorelease{

return self;

}


@end



iOS設計模式之單例模式