swift单例

简介: swift单例
  • 1.单例是一个在 Cocoa 中很常用的模式了。对于一些希望能在全局方便访问的实例,或者在 app 的生命周期中只应该存在一个的对象,我们一般都会使用单例来存储和访问。在 Objective-C 中单例的公认的写法类似下面这样:


@implementation TestViewController
+ (id)sharedManager {
      static TestViewController *staticInstance = nil;
      static dispatch_once_t onceToken;
      dispatch_once(&onceToken, ^{
          staticInstance = [[self alloc] init];
       });
      return staticInstance;
}
@end

使用 GCD 中的 dispatch_once_t 可以保证里面的代码只被调用一次,以此保证单例在线程上的安全。


  • 2.因为在 Swift 中可以无缝直接使用 GCD,所以我们可以很方便地把类似方式的单例用 Swift 进行改写:


class TestViewController: UIViewController {
  class var sharedManager : TestViewController {
    struct Static {
      static var onceToken : dispatch_once_t = 0
      static var staticInstance : TestViewController? = nil
    }
    dispatch_once(&Static.onceToken) {
      Static.staticInstance = TestViewController()
    }
    return Static.staticInstance!
  }
}
  • 3.因为 Swift 1.2 之前并不支持存储类型的类属性,所以我们需要使用一个 struct 来存储类型变量。


这样的写法当然没什么问题,但是在 Swift 里我们其实有一个更简单的保证线程安全的方式,那就是 let。把上面的写法简化一下,可以变成:


class TestViewController: UIViewController {
   class var sharedManager : TestViewController {
       struct Static {
          static let sharedInstance : TestViewController = TestViewController()
       }
       return Static.sharedInstance
    }
 }
  1. 还有另一种更受大家欢迎,并被认为是 Swift 1.2 之前的最佳实践的做法。由于 Swift 1.2 之前 class 不支持存储式的 property,我们想要使用一个只存在一份的属性时,就只能将其定义在全局的 scope 中。值得庆幸的是,在 Swift 中是有访问级别的控制的,我们可以在变量定义前面加上 private 关键字,使这个变量只在当前文件中可以被访问。这样我们就可以写出一个没有嵌套的,语法上也更简单好看的单例了:

private let sharedInstance = TestViewController()
  class TestViewController: UIViewController  {
      class var sharedManager : TestViewController {
          return sharedInstance
      }
  }
  1. swift3.0以后我们普遍使用“果没有特别的需求,我们推荐使用下面这样的方式来写一个单例:

class TestViewController: UIViewController  {
     private static let sharedInstance = TestViewController()
     class var sharedManager : TestViewController {
          return sharedInstance
      }
  }


目录
相关文章
|
Swift
OC 和 swift 创建单例方法
OC 和 swift 创建单例方法
451 0
|
iOS开发 Swift
iOS - Swift SingleClass 单例类
前言 单例对象能够被整个程序所操作。对于一个单例类,无论初始化单例对象多少次,也只能有一个单例对象存在,并且该对象是全局的,能够被整个系统访问到。 单例类的创建 1.1 单例类的创建 1 单例类的创建 class SingleClass1 { var text:St...
768 0
|
安全 编译器 Swift
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
1091 2
|
Unix 调度 Swift
苹果iOS新手开发之Swift 中获取时间戳有哪些方式?
在Swift中获取时间戳有四种常见方式:1) 使用`Date`对象获取秒级或毫秒级时间戳;2) 通过`CFAbsoluteTimeGetCurrent`获取Core Foundation的秒数,需转换为Unix时间戳;3) 使用`DispatchTime.now()`获取纳秒级精度的调度时间点;4) `ProcessInfo`提供设备启动后的秒数,不表示绝对时间。不同方法适用于不同的精度和场景需求。
826 3
|
安全 Swift iOS开发
Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法
本文深入探讨了 Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法。Swift 以其简洁、高效和类型安全的特点,结合 UIKit 丰富的组件和功能,为开发者提供了强大的工具。文章从 Swift 的语法优势、类型安全、编程模型以及与 UIKit 的集成,到 UIKit 的主要组件和功能,再到构建界面的实践技巧和实际案例分析,全面介绍了如何利用这些技术创建高质量的用户界面。
342 2
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户点击按钮时,按钮将从圆形变为椭圆形,颜色从蓝色渐变到绿色;释放按钮时,动画以相反方式恢复。通过UIView的动画方法和弹簧动画效果,实现平滑自然的过渡。
282 1
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
【10月更文挑战第18天】本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户按下按钮时,按钮将从圆形变为椭圆形并从蓝色渐变为绿色;释放按钮时,动画恢复原状。通过UIView的动画方法和弹簧动画效果,实现平滑自然的动画过渡。
238 5
|
存储 移动开发 Swift
使用Swift进行iOS应用开发:探索现代移动开发的魅力
【8月更文挑战第12天】使用Swift进行iOS应用开发,不仅能够享受到Swift语言带来的简洁、快速、安全的编程体验,还能够充分利用iOS平台提供的丰富资源和强大功能。然而,iOS应用开发并非易事,需要开发者具备扎实的编程基础、丰富的实践经验和不断学习的精神。希望本文能够为您的iOS应用开发之旅提供一些有益的参考和帮助。
|
Swift iOS开发 Kotlin
苹果iOS新手开发之Swift中实现类似Kotlin的作用域函数
Swift可通过扩展实现类似Kotlin作用域函数效果。如自定义`let`, `run`, `with`, `apply`, `also`,增强代码可读性和简洁性。虽无直接内置支持,但利用Swift特性可达成相似功能。
232 7
|
调度 Swift Android开发
苹果iOS新手开发之Swift中的并发任务和消息机制
Swift的消息机制类似Android的Handler,实现任务调度有三种方式: 1. **Grand Central Dispatch (GCD)**:使用`DispatchQueue`在主线程或后台线程执行任务。 2. **OperationQueue**:提供高级接口管理`Operation`对象。 3. **RunLoop**:处理事件如输入源、计时器,类似Android的`Looper`和`Handler`。 **示例**: - GCD:在不同线程执行代码块。 - OperationQueue:创建操作并执行。 - RunLoop:用Timer添加到RunLoop中。
291 2

相关课程

更多