单例iOS

来源:互联网 发布:淘宝商城女打底衫 编辑:程序博客网 时间:2024/05/18 02:14

参考:http://ios.9tech.cn/news/2013/1028/38276.html

单例的保证应用程序的生命周期中有且仅有一个该类的实例对象,而且易于外接访问


下面分别是arc于非arc情况下的单例实现

arc

所谓arc就是自动引用计数的意思,原先需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成。


@interface RecordDB : NSObject

+(RecordDB *)sharedInstance;

@end


@implementation RecordDB


//arc模式下

+ (id *)sharedInstance{

    static RecordDB *_instance = nil;

    static dispatch_once_t onceToken;//检测bloc是否完成

    dispatch_once(&onceToken, ^{

        _instance = [[self alloc] init];

    });

    return _instance;

}


- (id)init{

    if (self = [super init]) {

        

    }

    return self;

}

@end


在这里面我们定义了一个静态变量_instance,仅初始化一次该变量。

这里用了GCD中dispatch_once以保证该变量只被GCD初始化一次。

如果不用GCD,可以用如下



+ (id *)sharedInstance{

    static RecordDB *_instance = nil;

    @synchronized(self){

        if (_instance == nil) {

            _instance = [[self alloc] init];

        }

    }

    return _instance;

}

当需要使用这个单例对象时,你只要调用就可以了:


非arc代码


@interface RecordDB : NSObject

+(RecordDB *)sharedInstance;

@end


static RecordDB *_instance = nil;

@implementation RecordDB


+ (id)sharedInstance{

    @synchronized(self){

        if (_instance == nil) {

            _instance = [[super allocWithZone:NULL] init];

        }

        return _instance;

    }

}

+ (id)allocWithZone:(struct _NSZone *)zone{

    return [[self sharedInstance] retain];

}


- (id)copyWithZone:(NSZone *)zone{

    return self;

}


- (id)retain{

    return self;

}


- (unsigned)retainCount{

    return UINT_MAX;//永不释放

}


- (oneway void)release{

}

- (id)autorelease{

    return self;

}







0 0
原创粉丝点击