2014-06-16 36 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 
} 

这显然比它需要更复杂。

我还会争辩说,这不是真正的懒惰初始化,它实际上与对象创建后某些时刻的实例变量的初始化有关。