2013-07-29 35 views
1

正如標題所說:在分配和初始化它之前檢查對象是否爲零是否有必要或是否是一種好的做法?在分配對象之前需要檢查nil

if (!_menuFetcher) { 
    _menuFetcher = [[MenuFetcher alloc] init]; 
    _menuFetcher.delegate = self; 

} 

我認爲這就是所謂的懶加載權?

+0

最好是請檢查是否對象是零訪問它。使用將爲您管理內存的屬性訪問器。 –

+0

因此,而不是使用實例變量_iVar,我應該使用self.iVar? :) – 7c9d6b001a87e497d6b96fbd4c6fdf

回答

2

延遲加載延遲對象的創建,直到您需要爲止。 UIViewController通過它的視圖來實現 - 創建一個視圖層次結構需要花費大量的時間和內存,所以直到訪問視圖才能完成。您可以使用條件語句(如您所示的條件語句)來實現延遲加載。理想情況下,你會把它放在一個屬性的訪問器中,並在任何地方使用這個屬性,所以你沒有遍佈整個地方的條件。

檢查某個對象是否存在並不是壞習慣,但使用屬性可以限制需要這樣做的地方數量,這可以簡化剩餘的代碼。

在分配之前不必總是檢查是否存在某些東西 - 大部分時間您應該已經知道了。例如,在您的-init方法中,您知道還沒有分配任何東西,您可以創建新對象所需的任何對象。

+0

謝謝。那麼我需要爲我所有的變量創建懶加載getters?然後使用self.iVar而不是_iVar? – 7c9d6b001a87e497d6b96fbd4c6fdf

+0

不,大多數時候你應該簡單地設置你的ivars,如果你需要他們設置。使用屬性而不是ivars通常是一個好主意。 – Caleb

+0

好的,非常感謝。 – 7c9d6b001a87e497d6b96fbd4c6fdf

1

是的,這基本上可以防止重新初始化已經初始化的東西。你應該一直這樣做,除非你100%確定你沒有重新初始化。但是,這不叫懶惰加載 - 有些不同。

例如,在表視圖中加載圖像時使用延遲加載。不是加載表格視圖中的所有圖像,只加載屏幕上可見的那些圖像。這種方法更適合加載時間,性能和內存。

+0

這是懶加載,它可能也適用於表中的圖像。它基本上意味着一個對象在第一次通過訪問器訪問時被加載。非常適合在表格視圖單元中資源消耗圖像。 –

+0

嗯,是的,你是對的。但我認爲,當你說懶加載時,每個人都會想到加載圖像和類似的表格:) –

1

通常你在getter方法中這樣做。

假設你有一個特性:

@property (nonatomic, strong) MenuFetcher *menuFetcher; 

您在視圖控制器使用說,那麼你就可以實現該屬性的吸氣劑這樣:

- (MenuFetcher *)menuFetcher 
{ 
    if (!_menuFetcher) { 
     _menuFetcher = [[MenuFetcher alloc] init]; 
     _menuFetcher.delegate = self; 
    } 
    return _menuFetcher; 
} 

你是正確的,這是一種惰性初始化(而不是加載)的形式 - 內存不分配,並且實例初始化直到它需要的地步。另外,你不需要有一個集中的初始化例程,也不需要擔心對象的設置 - 如果它不存在,它會被創建 - 如果你通過將其設置回零來消除它,下一次某事想要某個類型的實例時,它會再次創建。所以在這方面它有點優雅和高效。

因此,實際上,您第一次嘗試通過調用self.menuFetcher來讀取該屬性,如果尚未設置,您的getter將會注意到它爲零,併爲您創建並初始化它。一旦設置,屬性不再爲零,因此getter只是返回所持有的對象。

如果這適用於您正在編寫的內容,請使用延遲初始化。唯一需要注意的是getters能夠在懶惰初始化之外做其他事情 - 如果事情出錯了,那些有「副作用」的getter可能會很痛苦。保持簡單和專注。

0

惰性加載意味着「按需加載」,只執行時真正需要它的操作,它是這樣的:

- (MenuFetcher *)instance{ 
    if (_menuFetcher == nil){ 
     _menuFetcher = [[MenuFetcher alloc] init]; 
    } 
    return _menuFetcher; 
} 
+0

幾乎:-)你可能想要返回_menuFetcher或檢查並將其分配給_ivar。 –

+0

哈哈,在與客戶長時間爭吵後感到頭疼:S – null

1

這要看情況。

如果你只需要實例化一個新的對象,那麼就不需要檢查零。

分配對象之前不需要檢查零。一點也不。

但是,這是一個相當不錯的和廣泛傳播的模式,你在使用對象之前檢查零。如果參考文獻是零,那麼您可以「隨時」創建它。你必須在下面的代碼中看到它(在這裏或在調用者中)。有_menuFetcher將以某種方式使用。 (至少大部分probabyl) 或者這是一種可以在視圖控制器中多次調用的方法,如viewWillAppear。你可能有很好的理由不要早先實例化和初始化對象,並且只能對對象進行一次實例化。在該方法的下一次調用中,您只需重新使用之前創建的對象。

(我的意思是在評論第一寫這篇文章,不是一個答案,但它成爲長的評論。)

相關問題