ios 单例的实现

来源:互联网 发布:dhcp服务端口 编辑:程序博客网 时间:2024/06/02 04:20

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




0 0
原创粉丝点击