「iOS 面试之道」勘误(二)

本文是「iOS 面试之道」勘误系列的第二篇。git

Swift 初始化方法描述的漏洞

书中 105 页的描述是:Swift 初始化方法必须保证全部非 Optional 的成员变量都完成初始化。github

这个表述是不严谨的。面试

Swift 初始化方法必须保证:swift

  • 全部非 lazy /非 Optional 的可变 stored property
  • 全部非 computed 不可变 stored property

都完成初始化。其中 stored property 的对义语是 computed property。markdown

也就是说下列代码是不能被成功编译的,由于 bar 虽然是 Optional 的,可是确实一个不可变成员变量:session

class Foo {
    let bar: String?
    
    init() {
        
    }
}
复制代码

可是下列代码又是能够被成功编译的:app

class Foo {
    let bar: String = {
        return "Bar"
    }
    
    init() {
        
    }
}
复制代码

由于上述代码的 bar 是一个 computed property,而不是 stored property。框架

若是你以为上述描述实在太难记,那么只须要记忆如下内容:Swift 会强制全部不可变变量以及可变变量中非 optional 的在变量生命周期的「产生」阶段都被初始化。这个「产生」阶段对于 classstruct 的 properties 而言就是 init 函数,对于全局变量和函数体内的本地变量而言就是变量声明的时候。函数

Swift 和 Objective-C 的自省描述有问题

书中 109 页:oop

... 这两个方法([NSObject -isKindOfClass:][NSObject -isMemberOfClass:])的使用有一个前提,既 obj 必须是 NSObject 或其子类。

这个表述是有问题的,-isKindOfClass:-isMemberOfClass: 是定义在 NSObject 这个 protocol 之中的,只要听从 (conformed to) 了这个 protocol 那么你就能够使用这两个方法来进行自省,好比说 NSProxy 及其子类。

实际上 Objective-C runtime 也提供一组 API 来完成相似的功能,只是这组 API 中有些有能够不检查 class hierarchy。你若是构建过用来扩展 Objective-C 运行时的框架,那么你应该会很熟悉。

iOS 动画实现方式记录不彻底

iOS 动画还包括 CADisplayLink 驱动的动画,比较有名的使用这个类来驱动动画的 iOS UI 组件就有 LTMorphingLabel。另外有不少游戏或者三维程序也是用这个类来驱动的。

同时 UIScrollView 也是 iOS 上动画的重要来源,并且用这玩意儿作动画比较考验智力水平。基本上每一年苹果都会在 WWDC 开专门的 sessions 讲如何使用 UIScrollView 及其子类。

Plist 文件介绍不彻底

Plist 在早期还有二进制文件的实现。详情请看这篇文章

相关文章
相关标签/搜索