延時載入
或者說延時初始化是很常用
的優化方法
,在構建和生成新的物件的時候,記憶體分配
會在執行時耗費
不少時間
,如果有一些物件的屬性
和內容
非常複雜
的話,這個時間更不可忽略
。另外,有些情況下我們並不會立即
用到乙個物件的所有屬性,而預設情況下初始化時,那些在特定環境下不被使用的儲存屬性,也一樣要被初始化和賦值,也是一種浪費
。
在其他語言(包括objective-c)中延時載入
的情況是很常見
的。我們在第一次訪問某個屬性時,要判斷
這個屬性
背後的儲存是否已經存在
,如果存在
則直接返回
,如果不存在
則說明是首次訪問,那麼就進行初始化並儲存後再返回
。這樣我們可以把這個屬性的初始化時刻推遲,與包含它的物件初始化時刻分開,以達到提公升效能的目的。以objective-c舉例如下(雖然這裡既沒有費時操作,也不會因為使用延時載入而影響效能,但是作為乙個最簡單的例子,可以很好的說明問題):
@inte***ce object()
@property (nonatomic, copy)
nsstring
*teststring;
@end
@implementation object-(
nsstring
*)teststring
return _teststring;
}@end
在初始化object 物件
後,_teststring
是nil
。只有當首次
訪問teststring 屬性
時getter方法
才會被呼叫,並檢查
是否已經初始化
,如果沒有的話,就進行賦值
。我們之後再多次訪問這個屬性的話,因為_teststring
已經有值,因此直接返回
。
在swift中我們使用在變數屬性前加lazy 關鍵字
的方式來簡單的指定延時載入
。比如上面的**我們在swift中重寫的話,會是這樣:
class
classa()
}
我們在使用lazy
作為屬性修飾符時,只能
宣告屬性是變數
。另外我們需要顯式
的指定屬性型別
,並使用乙個可以對這個屬性進行賦值的語句來在首次訪問屬性時執行。如果我們多次訪問這個例項的str屬性
的話,可以看到只有一次
輸出。
為了簡化,我們如果不需要做什麼額外工作的話,也可以對這個lazy 的屬性直接寫賦值語句:
lazy
var str:
string
="hello"
相比起在objective-c中的實現方法,現在的lazy 使用起來要方便的多。
對於那些不需要完全執行,可能提前退出的情況,使用lazy
來進行效能優化
會非常有效。
Swift lazy 修飾符和方法
由王巍 onevcat 發布於 2015 10 07 延時載入或者說延時初始化是很常用的優化方法,在構建和生成新的物件的時候,記憶體分配會在執行時耗費不少時間,如果有一些物件的屬性和內容非常複雜的話,這個時間更是不可忽略。另外,有些情況下我們並不會立即用到乙個物件的所有屬性,而預設情況下初始化時,那...
C 修飾符 類修飾符和成員修飾符
c 修飾符之類修飾符 public internal partial abstract sealed static internal 本程式集內的成員可以訪問。partial 部分類,可以將乙個類分成幾部分寫在不同檔案中,最終編譯時將合併成乙個檔案,且各個部分不能分散在不同程式集中。c 修飾符之成員...
final修飾符和abstract修飾符
用final修飾的類無法被繼承 用final修飾的方法可以被繼承但是不能被重寫 用final修飾的變數表示常量,只能賦值一次 abstract修飾符可以修飾方法也可以修飾類,如果修飾方法,那麼這個方法就是抽象方法,如果修飾類,那麼就是抽象類。抽象類中可以沒有抽象方法,但是如果有乙個類中有抽象方法,那...