0

我的应用程序正在尝试确定今天的日期是否介于数组的开始日期和结束日期中的对象之间,然后会从数组中删除该对象。该代码成功地从数组中删除了对象,但只删除了所有其他对象(应该删除所有对象)。

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++;
}

如果第二双眼睛可以检查我的代码并查看我做错了什么,那将不胜感激!

4

2 回答 2

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.countto> 0而不是AdDataArray.count - 1to>= 0的原因是因为如果count是 0,使用count - 1会导致一个换行,因为count它是无符号的。

于 2013-07-19T19:58:01.263 回答
0

你有两个i++。删除最后一个。

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];
    }
}

来自developer.apple.com

为了填补这个空白,所有超出索引的元素都通过从它们的索引中减去 1 来移动。

因此,实际上,您可能必须在语句中添加i--内容if,因为i即使您删除了一个元素,也会自动添加。

于 2013-07-19T19:58:40.323 回答