一、值類型雹顺、引用類型
1. 用 let 修飾 結(jié)構(gòu)體實例的值類型
和 類實例的引用類型
時,分別修改它們的成員變量廊遍,能編譯通過嗎嬉愧?
-
核心點:理解 let 修飾的實例,其內(nèi)存是不可以改變的喉前。
木有警告信息的就代表能編譯通過
2. 方法和函數(shù)的區(qū)別没酣?類、枚舉卵迂、結(jié)構(gòu)體
都能定義方法嗎裕便?
- 方法和函數(shù)沒區(qū)別,是同一個東西
- 通常把定義在
類见咒、枚舉偿衰、結(jié)構(gòu)體
內(nèi)部的函數(shù),叫做方法
3. 思考下面這個方法show
,它的本質(zhì)是什么下翎?在代碼段如何存儲的缤言?(非常重要)
class Point {
var x = 11
var y = 22
func show() {
print(x,y)
}
}
var p = Point()
p.show()
- 上面類中的 show 方法,最終會其實會轉(zhuǎn)變成
類似下面的函數(shù)
视事,存儲在代碼段
func show(self: Point) {
print(self.x, self.y)
}
4. 定義一個全局變量let a = 10
胆萧,在底層機器碼階段,只知道 a
的地址上是一個存儲著 10
這個數(shù)據(jù)俐东,程序是怎么標記它是 Int
類型呢跌穗?(一個困擾很久的問題 )
- 其實對于這個問題,我一開始就進入了誤區(qū)虏辫。
- 在機器碼階段蚌吸,它根本不關(guān)心
a
的地址上存儲的數(shù)據(jù)是什么類型的,也不會存儲任何類型相關(guān)的信息(類型在編譯階段應(yīng)該保證的事情乒裆,有個符號表
)
查閱資料`https://qastack.cn/software/380347/how-do-variables-in-c-store-their-type`
5. 我們?nèi)绾巫C明函數(shù)和方法(類中定義的函數(shù))套利,都是存放在代碼段呢推励?
示例代碼
- 我們?nèi)缟蠄D所示打三個斷點鹤耍,進入
匯編調(diào)試
,可以拿到show 验辞、 show1 稿黄、 &a
的地址值 - 可以發(fā)現(xiàn)
&a 是全局常量
,存放在全局區(qū)
跌造,地址值大于 show 和 show1
-
show 和 show1
的地址值極其接近杆怕,所以大概率都存放在代碼區(qū)
二、閉包
1. 在 Swift 中有兩種方式定義函數(shù)壳贪,哪兩種陵珍?
閉包表達式
func
閉包函數(shù)
2. 閉包表達式
通常用于參數(shù)傳遞,可以進行簡寫(理解下列簡寫過程)
閉包表達式簡寫過程
3. 尾隨閉包表達式违施?為什么要有互纯?如何簡寫?
- 如果將一個
很長的閉包表達式
作為函數(shù)的最后一個參數(shù)
磕蒲,使用尾隨閉包可以增強函數(shù)的可讀性
- 尾隨閉包是一個被書寫在函數(shù)調(diào)用括號外面(后面)的閉包表達式
尾隨閉包
- 如果閉包表達式是函數(shù)唯一實參留潦,而且使用了尾隨閉包的語法,那就不需要在函數(shù)名后邊寫圓括號
尾隨閉包
4. 閉包(Closure)是什么辣往?
一個函數(shù)和它捕獲的變量\常量環(huán)境組合起來兔院,稱為閉包
- 一般指定義在函數(shù)內(nèi)部的函數(shù)
- 一般它捕獲的是外層函數(shù)的局部變量\常量
5. 請問下面閉包輸出是什么?
閉包
- 輸出:
1 3 6 10
站削, 為什么呢坊萝? - num 被捕獲會被拷貝到
堆內(nèi)存
6. 如何證明 num 被拷貝到了堆內(nèi)存呢?
斷點 1,沒有形成閉包的情況
-
獲得以匯編代碼的形式看斷點代碼:
斷點1的匯編屹堰,沒有形成閉包的情況 -
斷點 2
斷點 2肛冶,有閉包的情況
-
獲得以匯編代碼的形式看斷點代碼:
斷點 2 匯編,有閉包的情況 對比
斷點 1
和斷點 2
的匯編扯键,我們可以發(fā)現(xiàn)斷點 2
出現(xiàn)了alloc 函數(shù)
alloc 函數(shù)
往往意味著堆空間的開辟
-
設(shè)置如下兩個斷點
我們給代碼設(shè)置如下兩個斷點 -
var num = 0
這句代碼可以獲取 num 分配的內(nèi)存地址睦袖,通常放在rax 寄存器
中,然后我們取消這個斷點
獲取 num 對象內(nèi)的值
獲取 堆內(nèi)存中 num 對象的值
然后我們四次過掉剩下的斷點荣刑,分別進行打印馅笙,發(fā)現(xiàn)和我們猜想非常一致,num 的值也經(jīng)歷的
0 1 3 6 10
的變化借此充分證明了 num 被拷貝到了堆內(nèi)存中厉亏,也解答了這個打印結(jié)果的問題
7. 如果上題中的 num 變成全局變量董习,會捕獲嗎?
- 不會進行捕獲爱只,找不到任何
alloc 相關(guān)的函數(shù)
- 其實也沒必要進行捕獲皿淋,因為可以正常訪問
8. 為什么可以把閉包想象成一個類的實例對象?
閉包 VS 類實例對象
9. 閉包
和 閉包表達式
有什么不同恬试?
-
閉包表達式:
用于定義函數(shù)的方式之一 -
閉包:
一個函數(shù)和它捕獲的變量\常量環(huán)境組合起來窝趣,稱為閉包
10. 一道綜合題,測試對閉包的理解训柴,請說出輸出值哑舒?
綜合題
- 輸出:
答案