注册 AVAudioSession.interruptionNotification 的通知,可以收到播放打断通知。 系统将此通知发布到主线程。
其中userinfo有如下字段:
分began与end,用来表示打断开始与打断结束。
只在打断结束时返回。选项用 shouldResume 来指示:另一个音频会话的中断已结束,应用程序可以恢复其音频会话。
该属性只在打断开始时返回。存在于版本iOS 10.3-14.5。
用于确定这次中断是否由于系统挂起App所致。
获取到的是一个NSNumber表示的Bool。为true表示中断是由于系统挂起,false是被另一音频打断。
该属性只在打断开始时返回。存在于版本iOS 14.5以后,用来代替 AVAudioSessionInterruptionWasSuspendedKey 。
default :因为另一个音频会话被激活,音频中断。(例如后台播着音频,此时播放微信语音)
appWasSuspended :由于APP被系统挂起,音频中断
builtInMicMuted :音频因内置麦克风静音而中断(例如iPad智能关闭套【iPad's Smart Folio】合上)
以上是 Swift 官方教程中,对 Swift 内存管理的解释。通常情况的部分很好理解,Swift 中 ARC 负责绝大部分的内存管理,ARC部分可以参考我的另一篇博客: iOS内存管理初探 – 引用计数、AutoRelease与ARC ;但少数情况下,我们需要向ARC提供对象之间的关系来使其正确管理内存。那么少数情况是什么意思呢?这得从Swift中的循环强引用讲起。
如图所示的情况中,john指向的对象强引用了unit4A指向的对象,而unit4A指向的对象又强引用了john指向的对象。
paragraph实例有一个成员asHTML强引用了一个闭包,而这个闭包中又捕获了self,意味着对self的强引用。
在ARC下,引用循环的情况是编译器无法自动解决的,这就是上文提到的少数情况。weak 和 unowned 的存才就是为了给编译器提供更多的信息,来打破循环引用。
含义 :weak 即弱引用,当把一个实例声明为弱引用时,此实例不会持有这个对象,即不会使对象的引用计数加1。当对象被废弃,其所有的弱引用会被置为 nil。
适用场景 :
由于 tenant 是弱引用,当 tenant 引用的对象被销毁(如赋值 nil),tenant 被置为空,并且释放对 apartment的强引用,此时 apartment 所指对象就可以正常释放了。
由于 self.delegate 指向的是外部对象,生命周期与self无关,所以可能在被捕获后变为nil。(delegate 一般都声明为weak以避免循环引用)
含义 :无主引用,与弱引用一样,当把一个实例声明为无主引用时,此实例不会持有这个对象,即不会使对象的引用计数加1。但与弱引用不同的是,当对象被废弃,其无主引用并不会被置为 nil。
适用场景 :
虽然在这个例子中,capitalCity 与 country 的生命周期相同,理论上讲将其中任何一个声明为无主引用都可以打破引用循环,但 capitalCity 与 country 之间有从属关系,所以倾向于将“大”的一方,即 country 声明为无主引用。
self 与属于 self 的成员变量 someClosure 生命周期相同,同时销毁,所以声明为无主引用。
Automatic Reference Counting
在Swift中,写下 unowned 相当于 unowned(safe)。但在官方文档中提到, Swift 还提供了另一种不安全的无主引用 unowned(unsafe) 来禁用运行时的安全检查。运行时的安全检查就是使 unowned(safe) 安全的原因。
unowned(safe) :当访问 unowned(safe) 类型的无主引用时,运行时会进行安全检查,如果对象已经废弃,将抛出异常并终止程序。
unowned(unsafe) :unowned(unsafe) 的作用效果实际上相当于 Objective-C 属性标示符中的 assign/unsafeunretained。访问 unowned(unsafe) 类型的无主引用时,运行时的安全检查被禁用,这时会有三种情况:
The Swift Programming Language (Swift 3.1) : Automatic Reference Counting
What is the difference in Swift between 'unowned(safe)' and 'unowned(unsafe)'?
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)