題目一
var car = "大奔"
let block = { (car: String) in
print("我開\(car)")
}
car = "雅迪"
block(car)
block的參數(shù)是外界傳入的,調(diào)用時(shí)block傳入的參數(shù)值為"雅迪",所以答案為
我開雅迪
題目二
var car = "大奔"
let block = { [ car ] in
print("我開\(car)")
}
car = "雅迪"
block()
block在調(diào)用之前耘擂,將car捕獲為自身局部變量,捕獲時(shí)car的值為"大奔"絮姆,所以答案為
我開大奔
題目三
var car = "大奔"
let block = {
print("我開\(car)")
}
car = "雅迪"
block()
block沒有對(duì)car進(jìn)行復(fù)制醉冤,所以block內(nèi)部的car還是全局的car變量,所以答案為
我開雅迪
題目四
class Car {
var name: String = ""
}
var car = Car()
car.name = "大奔"
let block = { [ car ] in
print("我開\(car?.name)")
}
car.name = "雅迪"
block()
block在調(diào)用之前篙悯,將car捕獲為自身的局部變量蚁阳,但是car的name屬性為指針類型,所以答案為
我開雅迪
題目五
在題目四的基礎(chǔ)上鸽照,在name重新賦值前螺捐,更新car的指針指向,即
class Car {
var name: String = ""
}
var car = Car()
car.name = "大奔"
let block = { [ car ] in
print("我開\(car.name)")
}
car = Car()
car.name = "雅迪"
block()
block在調(diào)用之前,將car捕獲為自身的局部變量定血,又因?yàn)閏ar在block調(diào)用之前就被重新賦值赔癌,所以block捕獲的car與外界的car不是同一個(gè),block捕獲的car還是car在第二次賦值前的那個(gè)澜沟,即name="大奔"届榄。所以答案為
我開大奔
題目六
在題目五的基礎(chǔ)上,捕獲的car用weak修飾倔喂,即
class Car {
var name: String = ""
}
var car = Car()
car.name = "大奔"
let block = { [ weak car ] in
print("我開\(car?.name)")
}
car = Car()
car.name = "雅迪"
block()
如題五的解釋的基礎(chǔ)上铝条,因?yàn)椴东@的car為弱引用類型,所以此時(shí)car在block中相當(dāng)于做了一次淺拷貝席噩,在car被重新賦值時(shí)班缰,原指針被銷毀。所以答案為
我開nil