[iOS] 单例的各种写法

单例规则

  1. 单例必须是唯一的(要不怎么叫单例?) 在程序生命周期中只能存在一个这样的实例。单例的存在使我们可以全局访问状态。例如:

NSNotificationCenter, UIApplication和NSUserDefaults。

  1. 为保证单例的唯一性,单例类的初始化方法必须是私有的。这样就可以避免其他对象通过单例类创建额外的实例。

  2. 考虑到规则1,为保证在整个程序的生命周期中值有一个实例被创建,单例必须是线程安全的。并发有时候确实挺复杂,简单说来,如果单例的代码不正确,如果有两个线程同时实例化一个单例对象,就可能会创建出两个单例对象。也就是说,必须保证单例的线程安全性,才可以保证其唯一性。通过调用dispatch_once,即可保证实例化代码只运行一次。

Objective - C

@interface Kraken : NSObject
@end
 
@implementation Kraken
 
+ (instancetype)sharedInstance {
    static Kraken *sharedInstance = nil;
    static dispatch_once_t onceToken;
     
    dispatch_once(&onceToken, ^{
        sharedInstance = [[Kraken alloc] init];
    });
    return sharedInstance;
}
 
@end

Swift

1. 最丑陋方法(Swift皮,Objective-C心)

class TheOneAndOnlyKraken {
    class var sharedInstance: TheOneAndOnlyKraken {
        struct Static {
            static var onceToken: dispatch_once_t = 0
            static var instance: TheOneAndOnlyKraken? = nil
        }
        dispatch_once(&Static.onceToken) {
            Static.instance = TheOneAndOnlyKraken()
        }
        return Static.instance!
    }
}

2. 结构体方法(“新瓶装老酒)

class TheOneAndOnlyKraken {
    class var sharedInstance: TheOneAndOnlyKraken {
        struct Static {
            static let instance = TheOneAndOnlyKraken()
        }
        return Static.instance
    }
}

3.全局变量方法(“单行单例”方法)

private let sharedKraken = TheOneAndOnlyKraken()
class TheOneAndOnlyKraken {
    class var sharedInstance: TheOneAndOnlyKraken {
        return sharedKraken
    }
}

4. 最完美的

class TheOneAndOnlyKraken {
    static let sharedInstance = TheOneAndOnlyKraken()
    private init() {} //This prevents others from using the default '()' initializer for this class.
}

原文地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,339评论 4 61
  • 三月春意胜,芳草遍天涯,好雨润万物,东风醉百花,青山若翡翠,绿歌动晚霞,皎皎天心月,今夜照谁家? 江南的春...
    吾念植阅读 3,635评论 0 1
  • 时间:2016.12.7 进度:序言 有问题的电车page 1-10 笔记:电车难题有多个版本,最有名的例子是一位...
    24K超超老师阅读 6,210评论 0 1
  • 2014年5月,上海余德耀美术馆盛大开幕。作为志愿者,见证了美术馆从一个废弃的“仓库”摇身变成大型空间艺术展览馆,...
    九时代阅读 3,418评论 0 2
  • 十年一梦至如今, 物是人非景色新。 战友本是親手足, 走失兄弟何处寻。 一一轻舟己过
    A都督阅读 1,599评论 0 0