单例就是一个类在此程序里只有唯一实例,每次总是返回自己的同一个实例.
何时使用单例:
1.类只能有一个实例,而且必须从一个为人熟知的访问点对其进行访问,比如工厂方法.
2.这个唯一的实例只能通过子类化进行扩展,而且扩展的对象不会破坏客户端代码.
以下是创建比较严格的方法:
头文件
@interface Singleton : NSObject
{
}
+ (Singleton *) sharedInstance;
@end
源文件
#import "Singleton.h"
@implementation Singleton
static Singleton *sharedSingleton = nil;
+ (Singleton*) sharedInstance
{
if( sharedSingleton == nil ){
//因为重载了此类的allocWithZone所以使用父类的内存分配方法
sharedSingleton = [[super allocWithZone:Null] init];
}
return sharedSingleton;
}
+ (id) allocWithZone:(NSZone*)zone
{
return [self sharedinstance];
}
- (id) copyWithZone:(NSZone*)zone
{
return self;
}
- (id) retain
{
return self;
}
- (NSUInteger) retainCount
{
return NSUIntegerMax;
}
- (id) release
{
}
- (id) autorelease
{
return self;
}
@end
要是想子类化单例的话,只需要把
sharedSingleton = [[super allocWithZone:Null] init];
这里改成
sharedSingleton = [NSAllocateObject([self class], 0, NULL) init];
这样的话子类化单例后,分配的就是子类的对象了.
如果单例对象要由多个线程访问,那么使它的线程安全至关重要.需要加线程保护了.