譯 在 iOS Swift 中的懶載入變數

2021-09-24 06:47:52 字數 2608 閱讀 7284

譯文出自:掘金翻譯計畫

譯者:kirinzer

校對者:portandbridge, iweslie

這篇文章解釋了在 swift 中懶載入變數是如何工作的,你必須對閉包有一些了解。

閱讀這篇文章獲取更多關於閉包的資訊.

當我們進行 ios 開發時,我們應該非常關注應用程式的記憶體占用情況。如果應用程式很複雜,那麼記憶體問題就會是對於開發者的乙個主要的挑戰。所以,首先考慮到記憶體分配問題的開發者能夠真正的寫出優化的**。除非確實有必要,否則開發者要避免做一些耗時的工作。那些複雜的分配記憶體操作會消耗更多的時間,並且對於程式的效能有嚴重的影響。

swift 有內建在語言中的機制,可以即時的計算那些耗時工作。它叫做懶載入變數。這種變數只有在你第一次需要它的時候才被指定的方法建立。如果從沒有使用過該變數。那麼方法就不會執行,所以它可以幫助減少一些處理時間。

蘋果的官方文件寫道:

乙個懶載入儲存屬性是種只有在首次使用時,才計算其初始值的屬性。你可以通過在宣告前加lazy修飾符來標示乙個懶載入儲存屬性。

你必須將乙個懶載入屬性宣告為乙個變數(通過var關鍵字),因為它的初始化值也許不能獲得,直到例項的初始化完成。常量屬性在初始化完成之前一定會有乙個值,因此不能用懶載入宣告。

為了解釋這些,我會使用乙個很基礎的示例:假設有乙個結構體叫做 interviewcandidate。它有乙個可選的布林值,決定候選人正在申請 ios 或者 android。iosresumedescription 和 androidresumedescription 被宣告為懶載入屬性。那麼在下面的**中,乙個人是 ios 開發者,懶載入變數iosresumedescription將會在呼叫列印方法的時候被初始化。沒有被呼叫的androidresumedescription就會是 nil。

//: playground - noun: 人們用來玩耍的地方

import uikit

struct

interviewcandidate

() lazy

var androidresumedescription: string = ()

}var person1 = interviewcandidate()

person1.isios = true

if person1.isios! else

複製**

這是乙個非常基礎的例子。如果我們有乙個複雜的類或結構,它包含從迴圈的函式返回結果的計算變數,並且如果我們建立 1000 個這樣的物件,那麼效能和記憶體將會受到影響。

這有一些懶載入屬性相對於儲存屬性的優點。

只有在讀取懶載入屬性時,才會執行與該屬性關聯的閉包。 因此,如果由於某種原因該屬性未被使用(可能是因為使用者的某些決定),則可以避免不必要的分配和計算。

你可以使用乙個儲存屬性給懶載入屬性賦值。

注意你能夠在懶載入的屬性閉包內部使用self。這不會導致任何迴圈引用。原因在於它立即使用的這個閉包{}()被認為是@noescape。它不會引用捕獲的self

但是,如果你在方法中使用self。事實上,如果你正在使用的是乙個類而不是結構體,你也應該在你的方法內宣告[unowned self]那樣你才不會建立乙個強引用(檢視下面的**)。

// playground code

import uikit

import foundation

class

interviewtest

() // 這裡沒有迴圈引用 ..

init(name: string)

}let testobj = interviewtest(name:」abhi」)

testobj.greeting

複製**

你能夠引用這個變數,無論你是否使用了閉包。

lazy

var iosresumedescription = 「i am an ios developer」

複製**

這樣的語法也可以執行。

注意:記住,懶載入屬性的用途是只有它們第一次被需要的時候才會被計算,在這之後它們的值就被儲存下來了。所以,如果你第二次使用iosresumedescription,預先儲存的屬性就會返回。

如果發現譯文存在錯誤或其他需要改進的地方,歡迎到 掘金翻譯計畫 對譯文進行修改並 pr,也可獲得相應獎勵積分。文章開頭的本文永久鏈結即為本文在 github 上的 markdown 鏈結。

ios swift 對比懶載入和普通賦值的區別

定義乙個字串的變數的方法 objc view plain copy 直接賦值 var str jobdeer 閉包方式 varstr string 簡化閉包,省略了等號和括號 varstr string objc view plain copy 閉包中可以定義get set方法。varstr str...

Spring中懶載入與非懶載入

在xml配置檔案中,延遲初始化將通過元素中的lazy init屬性來進行控制。例如 在容器層次中通過在元素上使用 default lazy init 屬性來控制延遲初始化也是可能的。如下面的配置 在同乙個檔案中裡面設定的優先順序大於裡設定的優先順序 immediately lazy immediat...

iOS中的懶載入

通俗一點就是用到時再載入,而且只載入一次,其實就是所謂的重寫物件的get方法,當系統或者開發者呼叫物件的get方法時,再去載入物件。實現 重寫get方法時,先判斷物件當前是否為空,為空的話再去例項化物件 使用懶載入的好處 inte ce viewcontroller property nonatom...