单例模式

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

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

 

转载于:https://www.cnblogs.com/bluceZ/p/3942728.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值