swift 知识点-day3

106 阅读3分钟

1. swift 中 strong, weak, unowned 的作用

  • strong 代表着强引用,是默认属性。当一个对象被声明为 strong 时,就表示该对象被一个强指针引用。此时该对象的引用计数会增加1。
  • weak 代表着弱引用。当对象被声明为 weak 时,父层级对此对象没有指向,该对象的引用计数不会增加1。它在对象释放后弱引用也随即消失。继续访问该对象,程序会得到 nil,不会崩溃
  • unowned 与弱引用本质上一样。唯一不同的是,对象在释放后,依然有一个无效的引用指向对象,它不是 Optional 也不指向 nil。如果继续访问该对象,程序就会崩溃。

weak 和 unowned 的引入是为了解决由 strong 带来的循环引用问题。

weak 和 unowned 的使用场景 当访问对象时该对象可能已经被释放了,则用 weak,比如修饰 delegate。当访问对象确定不可能被释放,则用 unowned。比如 self 的引用。实际上为了安全起见,很多公司规定任何时候都使用 weak 去修饰。

2. 说说Swift为什么将String,Array,Dictionary设计成值类型?

  • 值类型相比引用类型,最大的优势在于内存使用的高效。值类型在栈上操作,引用类型在堆上操作。栈上的操作仅仅是单个指针的上下移动,而堆上的操作则牵涉到合并、移位、重新链接等。也就是说 Swift 这样设计,大幅减少了堆上的内存分配和回收的次数。同时 copy-on-write 又将值传递和复制的开销降到了最低。
  • String,Array,Dictionary设计成值类型,也是为了线程安全考虑。通过 Swift 的 let 设置,使得这些数据达到了真正意义上的“不变”,它也从根本上解决了多线程中内存访问和操作顺序的问题。
  • 设计成值类型还可以提升 API 的灵活度。例如通过实现 Collection 这样的协议,我们可以遍历 String,使得整个开发更加灵活高效。

3. 闭包是引用类型吗?

闭包是引用类型。如果一个闭包被分配给一个变量,这个变量复制给另一个变量,那么他们引用的是同一个闭包,他们的捕捉列表也会被复制。

4. 关键字 mutating

在 Swift 中,mutating 关键字用于标记可以修改结构体属性的方法。

结构体是值类型,这意味着它们的值在赋值或传递给函数时会被复制。默认情况下,结构体属性是不可变的,这意味着不能在方法内部修改它们。

要修改结构体属性,需要使用 mutating 关键字标记方法。例如:

struct Point { 
  var x: Int 
  var y: Int 
  
  mutating func move(byX dx: Int, byY dy: Int) { 
    x += dx 
    y += dy 
  } 
} 

var point = Point(x: 1, y: 2) 
point.move(byX: 3, byY: 4) 
print(point) // prints "(4, 6)"