代码编织梦想

Talk is cheap. Show me the code.


class TestShareInstance{
    var age:Int
    static let shareInstane:TestShareInstance = TestShareInstance(age: 3);
    private init(age:Int){
        self.age = age;
    };
}
 


说说原理

1. swift在类中,类变量是能够保证线程安全,swift底层,static关键字的实际上是使用`dispatch_once`语法来实现的,如下一段swift编译中间产物SIL语言中的代码就能看到底层的实现.staic变量被声明为全局变量


// static TestShareInstance.shareInstane
sil_global hidden [let] @static main.TestShareInstance.shareInstane : main.TestShareInstance : $TestShareInstance
 


2.在get方法中获取变量调用了swift内嵌的builtin "once",实际上调用的是`swift_once`方法

sil单例


3.在swift源码中可以搜索到`swift_once`方法的内部实现如下,内部调用的就是GCD底层的`dispatch_once_f`,保证了单例的线程安全。


```
/// Runs the given function with the given context argument exactly once.
/// The predicate argument must point to a global or static variable of static
/// extent of type swift_once_t.
void swift::swift_once(swift_once_t *predicate, void (*fn)(void *),
                       void *context) {
#if defined(__APPLE__)
  dispatch_once_f(predicate, context, fn);
#elif defined(__CYGWIN__)
  _swift_once_f(predicate, context, fn);
#else
  std::call_once(*predicate, [fn, context]() { fn(context); });
#endif
}
```


在类中,将TestShareInstance的init方法设置为了private属性,这能保证其他人没有办法调用你的init的方法,只能调用你的shareInstane单例变量;从而保证了单例的不可修改特性。如果你要强行修改,编译器就会警告你,具体示例如下

swiftonce

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/a2025131311/article/details/111057732

设计模式之单例模式-爱代码爱编程

单例模式 饿汉式 ** * 饿汉式--太饿了,一上来就new一个对象 * @author Administrator * */ public class SingletonDemo1 { //懒汉式 //类初始化时候立即加载对象,没有延时加载的优势 private static SingletonDemo1 demo1 = new

单例模式-爱代码爱编程

目录 1 简介2 实现(饿汉式)2.1 步骤一2.2 步骤二2.3 步骤三3 几种实现方式3.1 线程不安全的懒汉式3.2 线程安全的懒汉式3.3 饿汉式3.4 双重校验锁 1 简介 单例模式涉及到一个单例类,该类负责自己创建自己的唯一对象,且必须提供给其他对象访问其唯一对象的方式。 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问

常用的设计模式总结-爱代码爱编程

本文是我学习时候所记笔记,主要 学习自尚硅谷设计模式视频 文章目录 1 观察者模式1.1 普通1.2 观察者1.3 总结2 代理模式2.1 介绍2.2 静态代理2.3 动态代理2.4 Cglib代理3 职责链模式3.1 普通3.2 职责链3.3 个人总结4 建造者模式4.1 普通4.2 建造者4.3 个人总结5 工厂模式5.1 简单工厂5.2 工厂

使用LiDAR功能的AR开源项目集下载-爱代码爱编程

XR沉浸新媒体体验 带有LiDAR传感器的iPad Pro深度相机带来沉浸式体验 项目工程代码: https://github.com/keijiro/Rcam2 AR世界三维重建可视化 iPad Pro上的ARKit 4+LiDAR实时世界三维重建,并通过Metal可视化 项目工程代码: https://github.com

iOS 文本点击事件-爱代码爱编程

项目中总会遇到给文本添加点击事件的问题,这里我使用的是textView控件. @property (strong, nonatomic) IBOutlet UITextView *textView; - (void)initTextView { NSMutableAttributedString *attributedString = [[NS

重提大一统?微软被曝开发原生运行安卓 App 的 Win10 系统,最早明年见-爱代码爱编程

转自:机器之心 据消息人士透露,微软正在着手一个代号为「拿铁」的项目。如果一切顺利,开发者有望在不更改代码或更改少量代码的情况下将安卓 app 引入 Win10。 近日,外媒 Windows Central 报道称,据消息人士透露,微软正在开发原生支持安卓应用的系统,有望允许开发者将安卓 app 打包成 MSIX 提交

appcode打开workspace无法找到xcodeproj项目文件问题的解决方法-爱代码爱编程

因为公司的项目改过项目名字,在xcode下编译正常,但是用appcode打开,xcode项目的workspace的时候,提示找不到xcodeproj项目文件 问了推荐给我使用的明哥,他也没遇到过。因为项目名字xcodeproj是我改的,为了区分2个app appcode无法找到xcodeproj的解决方法 错误重现解决方法: 错误重现 现在这

MacOS:多架构产物如何融合?-爱代码爱编程

本机系统架构:x86_64 太长不读总结:通常会默认以本机系统架构进行融合,如果编译器或链接器无法分析出需要融合的架构,需要指定 -target / -arch 来辅助。 1、多架构编译 编译多架构gcc -target x86_64-apple-macos10.15 -c add.c -o x86 gcc -target arm64-apple-

iOS面试题-Swift篇(二)-爱代码爱编程

swift 中的闭包结构是什么样子的 { (参数列表) -> 返回值类型 in 函数体代码 } 什么是尾随闭包 将一个很长的闭包表达式作为函数的最后一个实参 使用尾随闭包可以增强函数的可读性 尾随闭包是一个被书写在函数调用括号外面(后面)的闭包表达式 // fn 就是一个尾随闭包参数 func exec(v1: Int,