2014-06-16 66 views
1

我試圖在我的代碼中實現惰性實例化以加速我的應用程序。我的問題是,有一個處理for循環的時候,我應該創建一個對象權利的循環開始前,或內環路,基本上我應該這樣做:循環之前或之內的懶惰實例化

NSPredicate *pred= [NSPredicate predicateWithFormat:@"self LIKE %@", filter]; 
for(NSString* str in myArray){ 
//do stuff 
} 

或本:

for(NSString* str in myArray){ 
//do stuff 
NSPredicate *pred= [NSPredicate predicateWithFormat:@"self LIKE %@", filter]; 
//do stuff that needs this variable 
} 

我的想法是做第一個,但一個朋友說第二個,但是不是第二個創建對象,每次你通過循環,所以它更昂貴?

回答

1

這些都不一個是真正的懶惰:

  • 第一個創建謂詞即使循環並不需要在所有
  • 第二個是最優的,只有當循環執行一次執行;否則,會丟失NSPredicate的實例。

如果你想保持真正的懶惰,你可以在第一個代碼示例中添加一個條件來檢查myArray是否爲空。您也可以使用條件表達式,像這樣:

NSPredicate *pred= myArray.count ? [NSPredicate predicateWithFormat:@"self LIKE %@", filter] : nil; 

這是不是特別可讀的,雖然如此,我會建議你的第一種方法,當進入循環至少一次,這是最佳的停留。

0

那麼,延遲實例會是這個樣子,我認爲......

NSPredicate *pred = nil; 

for (NSString *string in myArray) { 
    // do stuff... 

    // if predicate is required 
    if (!pred) { 
     pred = [NSPredicate predicateWithFormat:@"self LIKE %@", filter]; 
    } 
    // use pred 
} 

但出於三個選項中。我會使用你的第一種方法。

0

我沒有看到太多的選擇,第一種方式既乾淨又簡單。等效替代方案實際上是:

NSPredicate *pred = nil; 
for (NSString* str in myArray){ 
    if (!pred) 
     pred = [NSPredicate predicateWithFormat:@"self LIKE %@", filter]; 
    //do stuff 
} 

這顯然比它需要更復雜。

我還會爭辯說,這不是真正的懶惰初始化,它實際上與對象創建後某些時刻的實例變量的初始化有關。