您的位置:首页 > 移动开发 > Swift

单例-------OC中单例 / Swift中单例

2015-12-01 00:00 183 查看
摘要: 单例-------OC中单例 / Swift中单例

单例 :[b]一般应用在 网络工具、音频工具[/b]

OC中单例写法:

+ (instancetype)sharedTools {

static id instance; //存储在静态区

static dispatch_once_t onceToken; // dispatch_once_t 长整型 如果 onceToken 为0,就执行block中的代码, 只执行一次(一次性执行)

dispatch_once(&onceToken, ^{
instance = [[self alloc] init]; //dispatch_once 只是对这句代码加锁,保证block中的代码只执行一次
});

return instance;
}

Swift中单例写法:

法一:
// 以下代码仿 OC 的写法!
// 在 Swift 中不允许在函数中定义静态成员
static var instance: SoundTools?

static var onceToken: dispatch_once_t = 0

// 1. 提供全局的访问点
class func sharedTools() -> SoundTools { // class func类函数 //func 函数

dispatch_once(&onceToken) { () -> Void in
instance = SoundTools()
}

return instance! //解包
}

法二:



// 静态区的对象只能设置一次数值


static let sharedTools = SoundTools()

法三:

// Swift 中的的单例写法和懒加载几乎一样 `static let`
// 同样也是在第一次使用时,才会创建对象
static let sharedTools: SoundTools = {

print("创建声音对象")

return SoundTools()
}()

附:

iOS4版本之前

static SingleClassManager *singleManager = nil;
+(SingleClassManager*)sharedManager
{
@synchronized(self)  //同步加锁,在多线程中使用,可以使线程安全
{
if(singleManager == nil)
{
singleManager = [[SingleClassManager alloc]init];
}
}
return singleManager;
}

iOS5版本开始(block函数)

+ (DSLocationManager *)shareInstance{

static DSLocationManager *manager = nil;

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
manager = [[DSLocationManager alloc]init];
});

return manager;
}

该方法有很多优势:

1 线程安全

2 很好满足静态分析器要求

3 和自动引用计数(ARC)兼容

4 仅需要少量代码

说明:

该函数接收一个dispatch_once用于检查该代码块是否已经被调度的谓词(是一个长整型,实际上作为BOOL使用)。它还接收一个希望在应用的生命周期内仅被调度一次的代码块,对于本例就用于shared实例的实例化。

dispatch_once不仅意味着代码仅会被运行一次,而且还是线程安全的,这就意味着你不需要使用诸如@synchronized 之类的来防止使用多个线程或者队列时不同步的问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  单例