iOS 细说单例

单例模式

定义
保证一个类仅有一个实例,并提供一个访问它的全局结点。当程序被杀死时,该实例对象被释放
好处
实例控制:单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保对象都访问唯一实例。
灵活性:因为类控制了实例化过程,所以类可以灵活更改实例化过程
应用场景
某个类经常被使用(节约系统资源)
定义工具类
共享数据
创建单例

假如要给一个SYJCar的类创建单例,其.m文件的代码如下:

方法一 GCD方式创建单例
#import "SYJCar.h"

@interface SYJCar ()<NSCopying>

@end

@implementation SYJCar

static id _instance;//定义一个全局的static的实例

+(instancetype)allocWithZone:(struct _NSZone *)zone
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [super allocWithZone:zone];
    });
    //dispatch_once保证程序在运行过程中只会被运行一次,从而保证了只会创建一个实例对象。
    return _instance;
}
+(instancetype)sharedInstance
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [[self alloc] init];
    });
    return _instance;
}

-(id)copyWithZone:(NSZone *)zone
{
    return _instance;
}

@end
方法二 互斥锁方式
#import "SYJCar.h"

@interface SYJCar ()<NSCopying>

@end

@implementation SYJCar

static id _instance;//定义一个全局的static的实例

+(instancetype)allocWithZone:(struct _NSZone *)zone
{
    @synchronized(self){
        if(_instance == nil){
            _instance = [super allocWithZone:zone];
        }
    }

    return _instance;
}
+(instancetype)sharedInstance
{
    //加锁
    @synchronized (self) {
        if(_instance == nil){
            //保证只会创建一个实例对象
            _instance = [[self alloc] init];
        }
    }
    return _instance;
}

-(id)copyWithZone:(NSZone *)zone
{
    return _instance;
}

@end

使用互斥锁会影响性能,所以最好还是使用GCD方式创建单例。

思考:如果我们需要在程序中创建多个单例,那么需要在每个类中都写上一次这段代码是不是太傻X了?我们可以使用宏来封装单例的创建,代码如下:

//.h文件使用
#define SYJSingletonH +(instancetype)sharedInstance;

//.m文件使用
#define SYJSingletonM \
static id _instance; \
+(instancetype)allocWithZone:(struct _NSZone *)zone \
{ \
    static dispatch_once_t onceToken; \
    dispatch_once(&onceToken, ^{ \
        _instance = [super allocWithZone:zone]; \
    }); \
    return _instance; \
} \
+(instancetype)sharedInstance \
{ \
    static dispatch_once_t onceToken; \
    dispatch_once(&onceToken, ^{ \
        _instance = [[self alloc] init]; \
    }); \
    return _instance; \
} \
-(id)copyWithZone:(NSZone *)zone \
{ \
    return _instance; \
}
演示

viewController.h文件
999624-20161024095531703-15875605.png

viewController.m文件
999624-20161024095553078-624096998.png
结果显示,单例创建成功!

转载于:https://www.cnblogs.com/s-y-j/p/5991905.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值