[随笔]swift 笔记
1. weak unowned 区别:从表面的行为上来说 unowned
更像oc的 unsafe_unretained
,而 weak
就是oc的 weak
。用通俗的话说,就是 unowned
设置以后即使它原来引用的内容已经被释放了,它仍然会保持对被已经释放了的对象的一个 "无效的" 引用,它不能是 Optional 值,也不会被指向 nil
。如果你尝试调用这个引用的方法或者访问成员属性的话,程序就会崩溃。而 weak
则友好一些,在引用的内容被释放后,标记为 weak
的成员将会自动地变成 nil
(因此被标记为 @weak
的变量一定需要是 Optional 值)。关于两者使用的选择,Apple 给我们的建议是如果能够确定在访问时不会已被释放的话,尽量使用 unowned
,如果存在被释放的可能,那就选择用 weak
。
2. @objc dynamic 区别:
如果我们要使用 Objective-C 的代码或者特性来调用纯 Swift 的类型时候,我们会因为找不到所需要的这些运行时信息,而导致失败。解决起来也很简单,在 Swift 类型文件中,我们可以将需要暴露给 Objective-C 使用的任何地方 (包括类,属性和方法等) 的声明前面加上 @objc
修饰符。注意这个步骤只需要对那些不是继承自 NSObject
的类型进行,如果你用 Swift 写的 class 是继承自 NSObject
的话,Swift 会默认自动为所有的非 private 的类和成员加上 @objc
。
即使是 NSObject
的子类,Swift 也不会在被标记为 private
的方法或成员上自动加 @objc
,以保证尽量不使用动态派发来提高代码执行效率。如果我们确定使用这些内容的动态特性的话,我们需要手动给它们加上 @objc
修饰。
但是需要注意的是,添加 @objc
修饰符并不意味着这个方法或者属性会变成动态派发,Swift 依然可能会将其优化为静态调用。如果你需要和 Objective-C 里动态调用时相同的运行时特性的话,你需要使用的修饰符是 dynamic
。一般情况下在做 app 开发时应该用不上,但是在施展一些像动态替换方法或者运行时再决定实现这样的 "黑魔法" 的时候,我们就需要用到 dynamic
修饰符了。在 KVO 一节中,我们提到了一个关于使用 dynamic
的实例。