2013-07-19 1 views
0

내 앱은 오늘 날짜가 배열의 시작 날짜와 종료 날짜 사이에있는 객체인지 확인한 다음 해당 객체를 배열에서 제거합니다. 코드는 배열에서 객체를 성공적으로 제거하지만 모든 객체 (모든 객체를 제거해야하는 객체) 만 제거합니다. 내가 잘못 뭐하는 거지 눈의 두 번째 세트 내 코드 가서 볼 수 있다면NSDate for 및 if 문을 사용하여 비교

for (int i = 0; i < [AdDataArray count]; i++) { 
    NSDate *dateStart = [self adStartDateAtIndex:i]; 
    NSDate *dateEnd = [self adEndDateAtIndex:i]; 
     if (([dateNow earlierDate:dateStart]) || ([dateNow laterDate:dateEnd])) 
     { 
     [AdDataArray removeObjectAtIndex:i]; 
     } 
i++; 
} 

, 그 주시면 감사하겠습니다!

+0

@JoshCaswell 거짓말 쟁이가 아님 - 여기서 문제는 날짜 비교가 아니라 루프와 관련된 것입니다. – rmaddy

+0

Oop, 나는 그 비교가 어떻게 행해지고 있는지 잘못 읽었다. @rmaddy. –

+0

비교가 너무 안좋아 보입니다.'[a priorDate : b]'는 'a'와 b의 초기 값을 반환합니다. ('laterDate :'와 비슷하지만 역순으로).'dateStart','dateEnd' 및'dateNow'가 모두 0이 아닌 것으로 가정하면, 모든 항목은 AFAICT가 제거 될 것입니다. – ipmcc

답변

2

문제는 루프 카운터에 있습니다. 항목을 삭제 한 다음 i의 추가 증분을 수행합니다.

내가 루프의 유사한 유형을 할 필요가 이제까지 나는 거꾸로 작업을 수행 할 때 :

for (NSUInteger i = AdDataArray.count; i > 0; i--) { 
    NSDate *dateStart = [self adStartDateAtIndex:i - 1]; 
    NSDate *dateEnd = [self adEndDateAtIndex:i - 1]; 
    if (([dateNow earlierDate:dateStart]) || ([dateNow laterDate:dateEnd])) { 
     [AdDataArray removeObjectAtIndex:i - 1]; 
    } 
} 

이유는 AdDataArray.count에서 > 0 대신 >= 0-AdDataArray.count - 1로 이동하는 것입니다 count이 0이면 count - 1 원인을 사용하기 때문에 count 이후의 랩은 서명되어 있지 않습니다.

+0

제안한대로 거꾸로 작업 할 생각이 전혀 없었으므로 그에 따라 코드를 변경했습니다. 그러나 내 응용 프로그램은'[AdDataAray removeObjectAtIndex : i]; 행을 시도 할 때 SIGABRT를 발생시킵니다. 이는 '경계 8을 넘어 경계 [0..7]'로 인해 발생합니다. '[AdDataAray removeObjectAtIndex : i-1];로 변경해야합니까? – VonKoob

+0

예, 죄송합니다. 그것을 놓쳤습니다. 루프 자체를 제외하고,'i'에 대한 모든 참조는'i-1'이어야합니다. 내 대답을 업데이트 할게. – rmaddy

0

두 개의 i++이 있습니다. 끝 부분을 제거하십시오. developer.apple.com 가입일

for (int i = 0; i < [AdDataArray count]; i++) { 
    NSDate *dateStart = [self adStartDateAtIndex:i]; 
    NSDate *dateEnd = [self adEndDateAtIndex:i]; 
    if (([dateNow earlierDate:dateStart]) || ([dateNow laterDate:dateEnd])) 
    { 
     [AdDataArray removeObjectAtIndex:i]; 
    } 
} 

,

는 갭을 채우기 위해이 인덱스 이후 모든 요소들은 인덱스 1 감산에 의해 이동된다.

그래서 실제로, 당신은 당신이 요소를 제거하는 경우에도 i가 자동 incemented받을 것이기 때문에, 당신의 if 문 내부 i--를 추가 할 수도 있습니다.

관련 문제