iOS - 单例创建
2019-04-19 本文已影响0人
跃文
Swift创建单例 代码如下:Swift5
import UIKit
class SingletonClass: NSObject {
var name:String = ""
// 注:(GCD - dispatch_once 在swift3.0后已废弃) 以下三种方式代替
// 禁止外部调用init初始化方法
private override init() {
super.init()
}
/*
单例创建方法一:
全局静态变量法
*/
static var shareSingleton1_Var = SingletonClass()
static let shareSingleton1_Let = SingletonClass()
/*
单例创建方法二:
结构体创建
*/
class func shareSingleton2() -> SingletonClass {
struct onceSingleton {
static var singleton = SingletonClass()
}
return onceSingleton.singleton
}
/*
单例创建方法三:
带立即执行闭包初始化器的全局变量:
*/
static var singleton: SingletonClass? = {
var singleton = SingletonClass()
return singleton
}()
class func shareSingleton3() -> SingletonClass {
// `dispatch_once()` call was converted to a static variable initializer
return singleton!
}
}
对应OC创建单例
/*
单例创建方法一:
*/
+ (instancetype)sharedSingleton {
static Singleton *_sharedSingleton = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
//因为下边已经重写了allocWithZone方法,不能再使用alloc方法,所以这里要调用父类的分配空间的方法
_sharedSingleton = [[super allocWithZone:NULL] init];
});
return _sharedSingleton;
}
// 防止外部调用alloc 或者 new
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
return [Singleton sharedSingleton];
}
// 防止外部调用copy (如果遵守NSCopying)
- (id)copyWithZone:(nullable NSZone *)zone {
return [Singleton sharedSingleton];
}
// 防止外部调用mutableCopy (如果遵守NSMutableCopying)
- (id)mutableCopyWithZone:(nullable NSZone *)zone {
return [Singleton sharedSingleton];
}
/*
单例创建方法二:
*/
在.h文件中禁止相关创建方法的调用 (利用NS_UNAVAILABLE)
- (instancetype)init NS_UNAVAILABLE;
+ (instancetype)new NS_UNAVAILABLE;
- (id)copy NS_UNAVAILABLE; // 没有遵循协议可以不写
- (id)mutableCopy NS_UNAVAILABLE; // 没有遵循协议可以不写
.m中实现
+ (instancetype)sharedSingleton {
static Singleton *_sharedSingleton = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// 要使用self来调用
_sharedSingleton = [[self alloc] init];
});
return _sharedSingleton;
}