IOS设计模式之单例模式
单例在我们的日常开发中经常会遇见,是一种较为常见的设计模式,所谓单例模式,顾名思义就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并
向整个系统提供这个实例。这个类称为单例类。
下面我们看看在在各种情况下单例的实现方式。
1 MRC(iOS5以前):
#import <Foundation/Foundation.h>
@interface Singleton : NSObject
+(Singleton *) instance;
@end @implementation Singleton
+(Singleton *) instance
{ static Singleton *sharedSingleton_ = nil;
@synchronized(self)
{ if(sharedSingleton_ == nil)
{
sharedSingleton_ = [NSAllocateObject([self class], 0, NULL) init];
}
}
return sharedSingleton_;
}
+ (id) allocWithZone:(NSZone *)zone
{
return [[self sharedInstance] retain];
}
- (id) copyWithZone:(NSZone*)zone
{
return self;
}
- (id) retain
{
return self;
}
- (NSUInteger) retainCount
{
return NSUIntegerMax;
}
-(void)release
{
[super release];
}
- (id) autorelease
{
return self;
}
@end
注意:MRC条件下实现单例需要实现他的allocWithZone、copyWithZone方法,以确保无论是以哪种方式创建的对象返回的实例都只有一个。
ios5以后,由于引进了ARC技术,使得单例模式的实现变得更为简便。
static RootViewController* sharedRootController = nil;
+(RootViewController *) sharedController
{ @synchronized(self)
{ if (sharedRootController == nil)
{
sharedRootController = [[self alloc] init];
}
} return singleController;
}
现在iOS5之后普遍使用了ARC技术,原来这个写法就显得很累赘了,release已经不使用了。
3 结合GCD来实现单例模式:
ios5以后,由于GCD的引入,使得单例又有了新的实现方式,为开发者日常开发提供便捷
+ (id)sharedInstance
{
static dispatch_once_t pred = 0;
__strong static id _sharedObject = nil;
dispatch_once(&pred, ^{
_sharedObject = [[self alloc] init]; // or some other init method
});
return _sharedObject;
}
使用dispatch_once,这个方法的意思是在应用程序生命周期内,这方法只执行一次,这就是ARC下结合GCD的一个单例的代码
好了,以上就是单例模式的各种实现方式,如果需要看代码的实现方式,这里附有链接,是我上传至Code4app的一个Demo