2014-06-16 4 views
1

내 응용 프로그램의 속도를 높이기 위해 코드 내에 지연 인스턴스화를 구현하려고합니다.루프 앞 또는 루프 안의 지연 인스턴스화

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 
} 

내 질문은 나는 기본적으로 내가이 작업을 수행해야 루프가 시작되기 전에 객체 권한을 만들거나 루프 내에서해야한다, for 루프를 처리 할 때입니다 내 생각은 첫 번째 일을하는 것이었지만 친구는 두 번째 것을 말합니다.하지만 두 번째 것은 루프를 통과 할 때마다 객체를 생성하지 않으므로 비용이 더 많이 듭니까?

답변

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 
    } 
    

    이는 분명히 필요 이상으로 복잡합니다.

    나는 이것이 실제로는 게으른 초기화가 아니라고 주장 할 것이다. 이것은 실제로 객체 생성 후 어느 시점에서 인스턴스 변수를 초기화하는 것과 관련이있다.