一、 OC中创建单例
/**
应用场景:网络工具,音频工具 ( 切换界面时,背景音乐继续放,不会重新播放,不会暂停 )
*/
@interface Singleton : NSObject
// 提供的静态实例的创建方法。(全局访问点)
应用场景:网络工具,音频工具 ( 切换界面时,背景音乐继续放,不会重新播放,不会暂停 )
*/
@interface Singleton : NSObject
// 提供的静态实例的创建方法。(全局访问点)
+(instancetype)sharedSinglenton;
-----------------------------------------------
//
OC
的单例,每次调用的是一个全局使用的类函数
+(
instancetype
)sharedSinglenton{
// 定义一个私有静态变量
static id singlenton;
// 是一个长整形,如果为 0 ,就执行 block 中的代码!
static dispatch_once_t onceToken;
//dispatch_once_t是GCD提供的结构体,使用时需要将GCD地址传递给下面的dispatch_once函数,dispatch_once函数能够记录该代码块是否被调用。
dispatch_once (&onceToken,^{
singlenton = [[ self alloc ] init ]; //self :本类
});
//dispatch_once是由GCD提供,作用是在整个应用程序的声明周期中只执行一次这个代码块。
// 定义一个私有静态变量
static id singlenton;
// 是一个长整形,如果为 0 ,就执行 block 中的代码!
static dispatch_once_t onceToken;
//dispatch_once_t是GCD提供的结构体,使用时需要将GCD地址传递给下面的dispatch_once函数,dispatch_once函数能够记录该代码块是否被调用。
dispatch_once (&onceToken,^{
singlenton = [[ self alloc ] init ]; //self :本类
});
//dispatch_once是由GCD提供,作用是在整个应用程序的声明周期中只执行一次这个代码块。
return singlenton;
}
二、 Swift中创建单例
// 1.
仿
OC
的写法!(仅供参考)
// 在 Swift 中不允许在函数中定义静态成员变量(保存在静态区的,有独立的存储空间)
// 在 Swift 中不允许在函数中定义静态成员变量(保存在静态区的,有独立的存储空间)
static var instance: SoundTools? //没有初始化会报错,所以设置成可选项。
//
长整形,
0
时执行下边的代码块。
static var onceToken: dispatch_once_t = 0
// 1. 提供全局的访问点(类函数) 返回值类型
class func sharedTools() -> SoundTools {
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是可选的,而我们返回时是必选的,所以需要强行解包。
//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 的对象
// 静态区的对象只能设置一次数值 ( 设完一次值之后,就不会再赋值了,不能改了 )
// Swift 中的的单例写法和懒加载几乎一样 `static let`
// 同样也是在第一次使用时,才会创建对象
//swift写法单例调用的是一个放在静态区的常量
//static let sharedTools2 = SoundTools()
static let sharedTools2: SoundTools = {
print ( " 创建声音对象 " )
return SoundTools () // 创建并返回一个 ShareSingleton 的对象
}()
-----------------------------------------------------
//
和上面是一样的
static let sharedTools3 = SoundTools () // 第一次调用时通过 () ,调用下面的构造函数
//override 重写 构造函数
override init () {
print ( " 创建 " )
static let sharedTools3 = SoundTools () // 第一次调用时通过 () ,调用下面的构造函数
//override 重写 构造函数
override init () {
print ( " 创建 " )
super.init()
//
让父类给变量赋初值
}
三、Swift和OC混编
1.桥接那个文件(swift调OC)
//
目的:让
Swift
能够调用
OC
// 使用:让所有 Swift 需要访问的 OC 的头文件在此处引入
// 使用:让所有 Swift 需要访问的 OC 的头文件在此处引入
#import
"NetworkTools.h"
2. OC调swift
在OC文件中导入:
#import
"
单例演练
-Swift.h"
// ProductName-Swift.h
注意
ProductName
不能包含中文和数字的组合
`-`
// 注意:Swift 调用 OC 不会有问题
// 注意:Swift 调用 OC 不会有问题
//
但是 OC 无法访问 Swift 中的特殊语法,例如:枚举!
可以修改项目名称