首页 > 代码库 > 单例模式

单例模式

方法一:(用互斥锁实现)

1、ARC中单例模式的实现:
1.1在.m中保留一个全局的static的实例
static id _instance;

1.2重写allocWithZone:方法,在这里创建唯一的实例(注意线程安全)

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

{

    @synchronized(self) {

        if (!_instance) {

            _instance = [super allocWithZone:zone];

        }

    }

    return _instance;

}

1,3实现copyWithZone:方法

+ (id)copyWithZone:(struct _NSZone *)zone

{

    return _instance;

}

1.4提供1个类方法让外界访问唯一的实例

+ (instancetype)sharedSoundTool

{

    @synchronized(self) {

        if (!_instance) {

            _instance = [[self alloc] init];

        }

    }

    return _instance;

}

 

2、在非ARC(MRC)中实现单例模式

2.1实现内存管理方法

- (id)retain { return self; }

- (NSUInteger)retainCount { return 1; }

- (oneway void)release {}

- (id)autorelease { return self; }

方法二:(用dispatch_once来实现)

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

        static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        NSLog(@"%s", __FUNCTION__);

        _instance = [super allocWithZone:zone];

    });

    return _instance;

}

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

    return _instance;

}

+ (id)sharedCZPlayer{

 

    //    线程不安全

//    if (_instance == nil) {

//       _instance = [[self alloc ] init];

//    }

 

    //    线程安全

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        if (!_instance ) {

            _instance = [[self alloc ] init];

        }

    });

 

    return _instance;

}

//  分布式

- (oneway void)release{

}

- (NSUInteger)retainCount{

    return 1;

}

- (id)autorelease{

    return _instance;

}

- (id)retain{

    return _instance;

}

 

把单例抽取成宏

#ifndef _4_________MRC__single_h

#define _4_________MRC__single_h

#define single_h(className) + (id)shared##className;

#define single_m(className) static id _instance; \

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

static dispatch_once_t onceToken; \

dispatch_once(&onceToken, ^{    \

NSLog(@"%s", __FUNCTION__); \

_instance = [super allocWithZone:zone]; \

}); \

return _instance; \

}   \

+ (id)shared##className{  \

static dispatch_once_t onceToken; \

dispatch_once(&onceToken, ^{    \

if (!_instance ) {  \

_instance = [[self alloc ] init];   \

}   \

}); \

return _instance;   \

}   \

- (oneway void)release{\

}\

- (NSUInteger)retainCount{  \

    return 1;   \

}   \

- (id)autorelease{  \

    return _instance;   \

}   \

- (id)retain{   \

    return _instance;   \

}   \

+ (id)copyWithZone:(struct _NSZone *)zone{   \

    return _instance;   \

}

#endif

 

单例模式