iOS 项目中 不可缺少的部分: 单例
OC版本 : 当一个对象无论被分配多少次内存时,都只会是一个内存地址
@implementation UserInfoTool
static id _instance;
static dispatch_once_t onceToken;
/**
单例的统一访问方法 (此方法暴露在 .h文件中)
@return 当前对象
*/
+ (instancetype)shareUserInfo{
dispatch_once(&onceToken, ^{
_instance = [[self alloc] init];
});
return _instance;
}
/**
实现 allocWithZone 方法: 防止其他人用 alloc init 方法 ,造成 重新分配内存
@param zone alloc init 时的内存
@return 当前对象
*/
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
dispatch_once(&onceToken, ^{
_instance = [super allocWithZone:zone];
});
return _instance;
}
/**
当其他人用 [当前实例对象 copy]; 避免重新分配内存
@param zone copy 的内存
@return 当前对象
*/
- (id)copyWithZone:(NSZone *)zone{
return _instance;
}
/**
当其他人用 [当前实例对象 mutableCopy]; 避免重新分配内存
@param zone mutableCopy 的内存
@return 当前对象
*/
- (id)mutableCopyWithZone:(NSZone *)zone{
return _instance;
}
@end
Swift版本 : 和OC一样,当一个对象无论被分配多少次内存时,都只会是一个内存地址 : Swift中有两种方法
方法一:
// 方法一 :
static let instance : UseInfoTool = UseInfoTool()
/// 单例的统一访问方法 , 相遇当提供了一个 公共方法来生成 对象
///
/// - Returns: 当前对象
class func shareUseInfo() -> UseInfoTool{
return instance
}
/// 将 init() 方法 变成私有方法 , 这样就保证外界 只能调取 shareUseInfo()这个方法 或者 copy || mutableCopy
private override init() {
}
/// 重写 copy
///
/// - Returns: 当前对象
override func copy() -> Any {
return self
}
/// 重写 mutableCopy
///
/// - Returns: 当前对象
override func mutableCopy() -> Any {
return self
}
方法二:
// 方法二 :
// 相当于提供了一个 静态的 不可变的 成员变量
static let shareUseInfo = UseInfoTool()
private override init() {
}
override func copy() -> Any {
return self
}
override func mutableCopy() -> Any {
return self
}