iOS--单例的正确书写

单例

@implementation SoundTools

1.保证存在的实例唯一

// 定义一个静态成员,保存唯一的实例

static id instance = nil;

2. 保证只分配一次内存

// 保证对象只被分配一次内存空间,通过dispatch_once能够保证单例的分配和初始化是线程安全的

+ (instancetype)allocWithZone:(struct _NSZone *)zone {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [super allocWithZone:zone];
});
return instance;
}

3. 只初始化一次

// 保证对象只被初始化一次

+ (instancetype)sharedSoundTools {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[self alloc] init];
});
return instance;
}

- (id)copyWithZone:(NSZone *)zone {
return instance;
}
@end


测试

// 测试代码如下:
- (void)viewDidLoad {
[super viewDidLoad];

SoundTools *s1 = [SoundTools sharedSoundTools];
NSLog(@"%p", s1);

}

  • (void)touchesBegan:(NSSet )touches withEvent:(UIEvent )event {
    SoundTools *s2 = [SoundTools sharedSoundTools];

    NSLog(@”%p”, s2);
    }

两个方法打印出来的地址完全一样!

单例更为严谨的写法–参考数据库管理员单例

import “FMDB.h”//导入fmdb头文件

@implementation DataBaseManager
{
FMDatabase *_fmdb;
}
1. 首先应当废除原有的初始化方法以防止外部通过init方法创建对象
- (instancetype)init{
//抛出异常
NSException *exception = [NSException exceptionWithName:@”exception” reason:@”You Can not use ‘[[xxx alloc] init]’ to creat DataBaseManager” userInfo:nil];
@throw exception;
//在需要引用单例的地方捕获异常

//断言  判断一个条件是否满足  如果不满足程序就奔溃 打印断言内容

// NSAssert(FALSE, @”You Can not use ‘init’ DataBaseManager”);
}
实现暴露的获取实例的方法
+(instancetype)shareDataBaseManager{

static DataBaseManager *manager;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    if (!manager) {
        manager = [[DataBaseManager alloc]initPrivate];
    }
});
return manager;

}
创建私有的初始化方法
- (instancetype)initPrivate{
self = [super init];
if (self) {
//do something
[self creatDataBase];

    }
return self;

}

  • (void)creatDataBase{
    //
    }

  • (NSString )getFilePathInDocuments:(NSString )fileName
    {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *filePath = [[paths firstObject] stringByAppendingPathComponent:fileName];

    return filePath;
    }

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值