[iOS] 安全唯一的单例模式

Swift

swift 3.0中废弃了dispatch_once,这里只记录一个标准的单例写法,具体相关的内容,可以看看这篇文章;

Swift 3.0 单例写法

代码:

import UIKit

class SingleOnce {

    // 单例
    static let shared = SingleOnce.init()
    private init(){}
    
    // 其他方法
    
    
}

这里将init方法私有化了,这样在其他地方就无法init,保证了单例的唯一性.

PS: 如果继承自其他类,init方法要加override关键字

使用:

使用单例

如果,在外部调用init方法,会编译报错:

无法外部初始化

Objective-C

在OC中, 我们可以这样写:

+ (instancetype)once {
    
    return [[self alloc] init];
    
}

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

这样, 我们在使用的时候, 无论是调用once 方法, 还是init方法, 都会得到同一个实例对象:

LQOnce *once1 = [LQOnce once];
NSLog(@"%@", once1);
    
LQOnce*once2 = [[LQOnce alloc]init];
NSLog(@"%@", once2);

输出:

<LQOnce: 0x60400000cf60>
<LQOnce: 0x60400000cf60>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • swift 3.0中废弃了dispatch_once,这里只记录一个标准的单例写法,具体相关的内容,可以看看这篇文...
    壹点微尘阅读 2,286评论 0 0
  • 常见的有这么4种方法 第一种简单到爆的 final关键字的作用是这个类或方法不希望被继承和重写 第二种 完全是OC...
    捡书阅读 5,820评论 0 3
  • 在之前的帖子里聊过状态管理有多痛苦,有时这是不可避免的。一个状态管理的例子大家都很熟悉,那就是单例。使用Swift...
    Tank丶Farmer阅读 11,475评论 0 5
  • 尽管在我之前的博文里我就写过关于管理状态的那些坑,但是有时候我们就是无法避免它们。其中一类管理状态的方式我们耳熟能...
    一黑阅读 2,372评论 0 1
  • 一花一天堂,一沙一世界,泥土的芳香,花草的艳丽,从小就生活在田野的我,便自小和这些打着熟悉的交道,如果我说...
    喂借一个微笑阅读 3,582评论 0 2