循环之前或之内的惰性实例化

时间:2014-06-16 08:37:59

标签: ios objective-c optimization lazy-loading

我试图在我的代码中实现延迟实例化以加快我的应用程序。我的问题是,在处理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
}

我的想法是做第一个,但朋友说第二个,虽然不是第二个创建对象每次你经历循环所以它更昂贵?

3 个答案:

答案 0 :(得分:1)

其中任何一个都不是真正的懒惰:

  • 即使循环不需要执行
  • ,第一个也会创建谓词
  • 第二个仅在循环执行一次时才是最佳的;否则,NSPredicate的丢弃实例会被创建。

如果您希望保持真正的懒惰,可以在第一个代码示例周围添加条件,以检查myArray是否为空。您还可以使用条件表达式,如下所示:

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

但这并不是特别易读,所以我建议保留第一种方法,这种方法至少输入一次是最佳的。

答案 1 :(得分: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
}

但是出于三个选项。我使用你的第一种方法。

答案 2 :(得分:0)

我没有看到太多的选择,第一种方式既干净又简单。实际上,等效的替代方案是:

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

这显然比它需要的更复杂。

我还认为这不是真正的延迟初始化,它实际上与对象创建后某个时刻的实例变量初始化有关。