swift 生命週期 Swift 中的指標

2021-10-16 21:40:00 字數 1303 閱讀 1967

題圖來自網際網路

指標是 c / c++ 中乙個很重要的概念,是這些相對低階的語言的靈魂,然而 swift 似乎天生對指標十分不友好,繁瑣的用法讓很多初學者一上來十分摸不著頭腦。本文就簡單談談 swift 中指標的一些用法。

為什麼要用指標?

其實使用 swift 來做 ios 開發時不會經常與指標打交道,foundation、uikit 等常用的 frameworks 都很好地 bridge 過,很多符號也橋接符合了 swift 的命名規範。然而很多底層的 frameworks 和一些 libc 裡的函式依然在大規模地使用指標。core foundation、security、core text、core audio、etc...這些框架在很多大型專業應用中使用廣泛,然而它們就是指標的重災地。

基本用法

首先我們來看看怎麼獲取到乙個變數的指標,我們預先定義了下面這個結構體:

struct foo

unmanaged 與 objective-c 物件

由於 objective-c 物件具有引用計數特性,單純的指標可能無法滿足使用需求,因此 swift 引入了 unmanaged 物件來管理引用計數。將乙個物件宣告為非託管有兩個方法:passretained

passunretained

如果這個非託管物件的使用全程,能夠保障被封裝物件一直存活,我們就可以使用 passunretained 方法,物件的生命週期還歸編譯器管理。如果非託管物件使用週期超過了編譯器認為的生命週期,比如超出作用域,編譯器自動插入 release 的 arc 語義,那麼這個非託管物件就是乙個野指標了,此時我們必須手動 retain 這個物件,也就是使用 passretained 方法。一旦你手動 retain 了乙個物件,就不要忘記 release 掉它,方法就是呼叫非託管物件的 release 方法,或者用 takeretainedvalue 取出封裝的物件,並將其管理權交回 arc。但注意,一定不要對乙個用 passunretained 構造的非託管物件呼叫 release 或者 takeretainedvalue,這會導致原來的物件被 release 掉,從而引發異常。

我們在自己的開發過程中基本也不會用到 unmanaged 來管理物件生命週期和引用計數,但是如果要與 mrc 的庫互動時,還是需要它的,unmanaged 物件提供了轉換為指標的方法。

wrap up

本文不夠全面地簡述了一下 swift 中指標的一些用法,大家在開發的時候當然能避免使用指標就避免使用,swift 之所以如此設計,還是為了型別安全和記憶體安全。不直接與指標打交道能明顯降低程式的複雜度,這也是現代語言需要解決的。好在 swift 沒有像 rust 那樣,為了安全性又引入了一堆新的概念。

就是這樣。

React 生命週期 生命週期方法

生命週期 掛載 更新 解除安裝 元件被建立 執行初始化 並被掛載到dom中,完成元件的第一次渲染 constructor props getderivedstatefromprops props,state render componentdidmount 元件被建立時會首先呼叫元件的構造方法,接受...

actived生命週期 Vuejs 生命週期

每個 vue 例項在被建立時都要經過一系列的初始化過程。如需要設定資料監聽 編譯模板 將例項掛載到 dom 並在資料變化時更新 dom 等。同時在這個過程中也會執行一些叫做生命週期鉤子的函式,這給了使用者在不同階段新增自己的 的機會。乙個 vue 例項 我們建立乙個 vue 例項,並在每個階段驗證 ...

生命週期篇 一 Activity生命週期理解

乙個activity 通俗點就叫乙個介面吧 在實際使用中會有幾種狀態 1.正在顯示 處於當前螢幕最頂層 2.尚且可見,但不可用 在其他介面下面,但未被完全覆蓋 3.完全不可見 被其他介面完全覆蓋,最常見的就是切換到桌面 以上是實際使用android手機的時候最直觀的介面狀態,那麼接下來我們來 一下,...