《Swift进阶》ReadingNotes_1

本着对喵神的崇拜,也是对他支持,当然自己也很需要,买了他的《Swift进阶》。说实话,价格不是很亲民,特别作为电子书就更觉得有点不能接受,不过我还是毫不犹豫的就买了,看过第一章之后才发觉书价值确实配得上其价格,甚至超过了其价格。
  好记性不如烂笔头,特别是有些东西用的少,知道了不用自然会遗忘,另外还有一些自己的理解,或者一些突发的想法,这些都需要一个记录。
  废话至此。

一、值与引用,值类型与引用类型,深复制和浅赋值

所谓值,就是像1,"就是你",true,[1,2,3]这样具体的、永久不变的。 
  引用是一种特殊类型的值,指向其他“值”得值。我的理解是,每一个具体的值——列如"二B青年"这个字符串值,在内存中必然有一个地址,假如这个地址是0x7fea93d066a0,那么0x7fea93d066a0这个十六进制的值就是"二B青年"的引用。
  那么对应的引用类型和值类型就好理解了。值类型,他的实例赋值给变量的是他值本身,引用类型的实例赋值给变量的是其值所在地址的值。

《Swift进阶》ReadingNotes_1_第1张图片
Snip20170116_2.png

  对应的深复制,直接复制一份值本身,放到新的内存块中。浅复制则是复制一份其引用,所有复制的引用都指向同一块内存。
  在Swift中 Date、Data、Array、String、Dictionary、Set、CGRect这些常用类型是结构体,也就是这些都是值类型。这么多类型都是值类型,在程序运行中必然会有大量的值复制,所以程序运行效率必然受到影响。Swift为了解决效率问题,额外实现了一个“写时复制(copy-on-write)”来保持操作的高效。至于“写时复制(copy-on-write)”技术的详情,在此留坑...

二、闭包

Swift函数也是一个值,所以函数可以做其他函数的参数或者返回值,这样的函数叫高阶函数(higher-order function)。
  所以Swift函数不需要声明在最高层级——也就是说,可以任意一个作用域声明一个函数。就像这样的

   func me()->(()->()){
        let a = "233"
        func you(){
            print(a)
        }
        return you
    }

在一个作用域内部定义的函数,把该函数传出了该作用,这个该函数捕获了局部变量a,持有这个变量a 并保存其状态。称这个变量为“闭合变量”,这样的函数叫做“闭包 ”
其实在swift闭包就是函数,函数也是闭包。

   let she: (String)-> Void = {str in
        print("konw" + str)
    }
    
    func she(_ str: String){
        print("konw" + str)
    }

这两者的其实是一样的,调用都是she(" me"),所以我们定义函数可以用func关键字来声明,也可以用{}这样的“闭包表达式 (closure expression)”来定义。
  需要注意的是,闭包是引用类型,所以引用同一闭包的所有变量都共享闭包内部变量的状态。

  func addNotClear()->(Int)->(){
        var a = 0
        func add(_ num:Int){
            a = a+num
            print(a)
        }
        return add
    }

    let add = addNotClear()
    add(1)
    add(10)

结果是:1,11

Other

静态派发:函数的调用在编译的时候已经确定了,编译器可能能够内联(inline)这些函数,也就是说,完全不去做函数调用,而是将这部分代码替换为需要执行的函数。静态派发还能够帮助编译器丢弃或者简化那些在编译时就能确定不会被实际执行的代码。

动态派发:编译器在编译时不需要知道哪个函数将被调用。在 Swift 中,这种动态特性要么由 vtable 来完成,要么通过 selector 和 objc_msgSend 来完成,前者的处理方式和 Java 或是 C++ 中类似,而后者只针对 @objc 的类和协议上的方法。

vtable(虚函数表):
  比如theSecondFun()记录在数组的第二个元素,当一个该类的对象实例
调用theSecondFun时就根据对应关系把第二个函数指针取出来,再去执行该
函数,这种行为叫晚绑定,也就是说在运行时才知道调用的函数是什么样子
的,而不是在编译阶段就确定的早绑定。

你可能感兴趣的:(《Swift进阶》ReadingNotes_1)