我试图在我的代码中实现延迟实例化以加快我的应用程序。我的问题是,在处理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
}
我的想法是做第一个,但朋友说第二个,虽然不是第二个创建对象每次你经历循环所以它更昂贵?
答案 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
}
这显然比它需要的更复杂。
我还认为这不是真正的延迟初始化,它实际上与对象创建后某个时刻的实例变量初始化有关。