iOS版单例模式的主要障碍:
- 发起调用的对象不能以其他分配方式实例化单例对象,否则就有可能创建单例类的多个实例。
- 对单例对象实例化的限制应该与引用技术内存模式共存。
代码实例:
@implementation Singleton
static Singleton *sharedSingleton = nil;
+ (Singleton *)sharedInstance
{
if (sharedSingleton == nil)
{
sharedSingleton = [[super allocWithZone:NULL] init];
}
return sharedSingleton;
}
// 分配实例内存,引用计数设置为1
+ (id)allocWithZone:(NSZone *)zone
{
return [[self sharedInstance] retain];
}
// 保证不会返回实例的copy,而是同一个实例
- (id)copyWithZone:(NSZone *)zone
{
return self;
}
- (id)retain { return self; }
- (NSUInteger)retainCount { return NSUIntegerMax; } // 表示不能释放的对象
- (void)release { } // 什么也不做
- (id)autorelease { return self; }
子类化单例:
alloc调用被转发给super,意味着NSObject会出来对象分配。如果不作修改的子类化,返回的实例总是Singleton。
可使用如下方法:
Singleton *s = [NSAllocationObject([Singleton class], 0, NULL) init];
线程安全:
需要在sharedSingleton静态实例的nil检查周围加入一些@synchronized()程序块或者NSLock实例。若有其他属性需要保护,也可以将它们声明为atomic型。