建立: 2018/03/09
完成: 2018/03/09
參照型資料與arc
arc● swift裡,只有類例項與閉包例項是參照型
● 生成時參照值為1, 被代入等每次+1, 減少每次-1
● 為0執行deinit並自動釋放
● 判定例項是否相同 ===/!==
===運算子: 判定是否指向同乙個記憶體位置(類例項, 閉包例項)
!==: ===的否定
arc記憶體管理
用arc進行記憶體管理就是arc記憶體管理
強參照迴圈
例項無法釋放的情況
參照迴圈, 即多個屬性互相參照
解決方案就是下面兩條: 弱參照, 非所有參照
弱參照● 參照時被參照物的參照計數不會增加, 加 weak
必須是var, 因為被參照物被釋放時值自動改為nil
weak var sample: sampleclass
類例項必須至少有乙個強參照, 不然arc=0, 直接釋放
● 零化, 參照物被釋放時值自動改為nil
● 用法: 類內部的類例項屬性用weak, 防止迴圈參照
非所有參照(unowned reference)
● 參照時被參照物的參照計數不會增加, 加 unowned
● 和weak一樣, 但是不會零化
● 用法: 參照量不會變nil得情況下用unowned代替weak
類似於t!和t?
● 速度不重要時, 都用weak
xcode去表示參照關係
執行專案後, [debug memory graph]按鈕
箭頭: 被參照物 <-- 參照物
可選鏈
可選鏈
a?.b?.c? //a, b, c都非nil, 返回a.b.c
//任意乙個為nil, 返回nil
可選鏈撥出方法
前面有nil時方法不執行, 方法的引數是方法也不執行
a?.b?.c?.getsampledata(data: createdata(with: 1)) //getsampledata(data:)和createdata(with:)都不執行
可選鏈的型
可選型別t?
a?.b?.c?.name //string?
不用可選鏈時為t的, 用可選鏈為t?
不返回值的方法的情況
不返回值的方法
//三個返回的型相同
func sample1(...) //
省略返回的型
func sample2(...) -> () //
返回型 ()
func sample3(...) -> void //
返回型void
● 可選鏈下不返回值的方法的返回型
void?
作為條件
if a?.b?.c?.method(...) !=nil//相當於
if let _ = a?.b?.c?.method(...)
對可選鏈代入
● 左側可選鏈取值失敗則不代入, 右側式子不會執行
● 左側可選鏈取值成功則可以代入
● 除了代入, 復合代入也一樣
key path
key path
可選鏈那樣的參照迴路
\型名.路徑 //\和型名間可以有空格, 路徑可以是可選鏈或其他屬性路徑
例
let keypath1 = \optionalchaintestclass.complexdata?.data
● 路徑內不能帶有方法名
● keypath的型
keypath《起點型, 獲取的型》
例
structsample
\sample.a
//型: keypath
用key path進行值的操作
● 獲取值
例項[keypath: keypath例項]
例
let keypath1 = \optionalchaintestclass.complexdata?.dataprint(type(of: keypath1))
//keypath>
print(optionalchaintest[keypath: keypath1] ?? "
nil") //
nil
● 代入
例項[keypath: keypath例項] = 新值
Swift 十七 可選鏈
1 swift入門學習筆記 第一版 對swift的基礎知識點進行梳理總結。知識點一直在變,只是作為參考,以蘋果官方文件為準 2 在學習完基本的知識點以後會結合官方文件及相關資料,在此版本的基礎上進行新增更改。1.1 可選型別使用時需要解包,解包時需要判斷是否為nil,常用if語句判斷,再去訪問其屬性...
Swift 可選鏈 備
在swift程式表示式中會看到問號 和感嘆號 它們代表什麼含義呢?這些符號都與可選型別和可選鏈相關,下面來看看可選鏈。可選鏈 類圖 它們之間是典型的關聯關係類圖。這些類一般都是實體類,實體類是系統中的人 事 物。employee通過dept屬性與department關聯,department通過co...
學習Swift 可選鏈
可空鏈式呼叫是一種可以請求和呼叫屬性 方法及下標的過程,它的可空性體現於請求或呼叫的目標當前可能為空 nil 如果可空的目標有值,那麼呼叫就會成功 如果選擇的目標為空 nil 那麼這種呼叫將返回空 nil 多個連續的呼叫可以被鏈結在一起形成乙個呼叫鏈,如果其中任何乙個節點為空 nil 將導致整個鏈呼...