分别使用OC和Swift语法创建单例

一、 OC中创建单例
   /**
   
应用场景:网络工具,音频工具 ( 切换界面时,背景音乐继续放,不会重新播放,不会暂停 )
 */



@interface Singleton : NSObject

// 提供的静态实例的创建方法。(全局访问点)
+(instancetype)sharedSinglenton;
-----------------------------------------------
// OC 的单例,每次调用的是一个全局使用的类函数
+( instancetype )sharedSinglenton{
   
   
// 定义一个私有静态变量
   
static id singlenton;
   
   
// 是一个长整形,如果为 0 ,就执行 block 中的代码!
   
static dispatch_once_t onceToken;
   
//dispatch_once_tGCD提供的结构体,使用时需要将GCD地址传递给下面的dispatch_once函数,dispatch_once函数能够记录该代码块是否被调用。
   
   
dispatch_once (&onceToken,^{
        singlenton = [[
self alloc ] init ];  //self :本类
    });
   
   
//dispatch_once是由GCD提供,作用是在整个应用程序的声明周期中只执行一次这个代码块。

   
   
return singlenton;
}

二、 Swift中创建单例
// 1. 仿 OC 的写法!(仅供参考)
    // Swift 中不允许在函数中定义静态成员变量(保存在静态区的,有独立的存储空间)
   
    static var instance: SoundTools?    //没有初始化会报错,所以设置成可选项。
    
// 长整形, 0 时执行下边的代码块。
    static var onceToken: dispatch_once_t = 0
   
   
// 1. 提供全局的访问点(类函数) 返回值类型
    class func sharedTools() -> SoundTools {
        print ( “你好,我要 创建声音对象 " )
        //dispatch_once(predicate: UnsafeMutablePointer<dispatch_once_t>, block: dispatch_block_t)
        //UnsafeMutable: 不安全的变量,所以是 var let 是常量安全的,
        //Pointer :指针,传递变量的时候使用 & ,表示变量的地址,  
        //<dispatch_once_t> 变量的类型
        //block: dispatch_block_t 闭包,执行 block 时会将 dispatch_once_t  的值修改为非 0
   
       
dispatch_once (&onceToken) { () -> Void in
           
// 实例化
            instance = SoundTools ()
        }
       
       
return instance!      //因为定义的instance是可选的,而我们返回时是必选的,所以需要强行解包。
    }

----------------------------------------------------
//2.swift特有的写法(利用静态区和常量的特点 )
    // 静态区的对象只能设置一次数值 ( 设完一次值之后,就不会再赋值了,不能改了 )
    // Swift 中的的单例写法和懒加载几乎一样 `static let`
    // 同样也是在第一次使用时,才会创建对象
    //swift写法单例调用的是一个放在静态区的常量
   
   
//static let sharedTools2 = SoundTools()
    static let sharedTools2: SoundTools = {
      
       
print ( " 创建声音对象 " )
       
       
return SoundTools ()  // 创建并返回一个 ShareSingleton 的对象
    }()

-----------------------------------------------------
// 和上面是一样的
    static let sharedTools3 = SoundTools ()    // 第一次调用时通过 () ,调用下面的构造函数
   
   
//override 重写   构造函数
    override init () {
       
print ( " 创建 " )
       
        super.init()    // 让父类给变量赋初值
    }


三、Swift和OC混编
1.桥接那个文件(swift调OC)
// 目的:让 Swift 能够调用 OC
// 使用:让所有 Swift 需要访问的 OC 的头文件在此处引入

#import "NetworkTools.h"


2. OC调swift

在OC文件中导入: #import " 单例演练 -Swift.h"

// ProductName-Swift.h 注意 ProductName 不能包含中文和数字的组合 `-`
// 注意:Swift 调用 OC 不会有问题
// 但是 OC 无法访问 Swift 中的特殊语法,例如:枚举!
可以修改项目名称


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值