ARC下的单例实现
#import "Singletion.h"
__strong static Singletion *_singletion=nil;
@implementation Singletion
+(Singletion *)shareSingletion
{
NSLog(@"11");
// static dispatch_once_t onceToken=0;
// dispatch_once(&onceToken, ^{
// NSLog(@"12");
_singletion=[[self alloc]init];
// });
return _singletion;
}
+(id)allocWithZone:(NSZone *)zone
{
NSLog(@"21");
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"22");
if (_singletion==nil) {
NSLog(@"23");
_singletion=[[super allocWithZone:zone]init];
}
});
return _singletion;
}
+(id)alloc
{
NSLog(@"31");
// static dispatch_once_t onceToken;
// dispatch_once(&onceToken, ^{
// NSLog(@"32");
// if (_singletion==nil) {
// NSLog(@"33");
_singletion=[super alloc];
// }
// });
return _singletion;
}
@end
注释部分可写可不写。调用关系是+(Singletion *)shareSingletion》》+(id)alloc》》+(id)allocWithZone:(NSZone *)zone。所有只要在+(id)allocWithZone:(NSZone *)zone中设定程序生命周期内只执行一次就可以。
自己写例子研究过的,如果有错误还请多多指教。
非ARC下的实现
#import "SingletionDemo.h"
static SingletionDemo *_singltion=nil;
@implementation SingletionDemo
+(SingletionDemo *)shareSingletion
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// @synchronized(self){
if (_singltion==nil) {
_singltion=[NSAllocateObject([self class], 0, NULL)init];
}
});
return _singltion;
}
+(id)allocWithZone:(NSZone *)zone
{
return [[self shareSingletion]retain];
}
-(id)copy
{
return self;
}
-(id)retain
{
return self;
}
-(NSUInteger)retainCount
{
return NSUIntegerMax;
}
-(oneway void)release
{
}
-(id)autorelease
{
return self;
}
@end