单例模式:总是返回自己的同一个实例,它提供了对类的对象所提供的资源的全局訪问点,而且返回的实例仅仅能被实例化一次.
单例设计模式设计须要考虑的两个问题:
(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