iOS設計模式之單例模式
單例模式:總是返回自己的同一個實例,它提供了對類的對象所提供的資源的全局訪問點,而且返回的實例僅僅能被實例化一次.
單例設計模式設計須要考慮的兩個問題:
(1) :發起調用的對象不能以其它分配方式實例化單例對象,否則,就有可能創建單例類的多個實例
(2) :對單例對象實例化的限制應該與引用計數內存模型共存.
Singleton.h
#import <Foundation/Foundation.h>
@interface Singleton : NSObject
+(Singleton
@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方法
*/
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設計模式之單例模式