If you need all the intermediate NSDate s, just get comps out of the loop:
NSDate *iterationDate = [NSDate date]; NSDateComponents *comps = [[NSDateComponents alloc] init]; [comps setYear:0]; [comps setMonth:0]; [comps setWeek:0]; [comps setDay:1]; [comps setHour:0]; [comps setMinute:0]; [comps setSecond:0]; for (int i = 0; i < 100; i++) { iterationDate = [currentCalendar dateByAddingComponents:comps toDate:iterationDate options:0]; }
You can achieve something similar using the CoreFoundation APIs:
CFCalendarRef calendar = CFCalendarCreateWithIdentifier(0, kCFGregorianCalendar); CFAbsoluteTime at = CFAbsoluteTimeGetCurrent(); const CFOptionFlags options = 0; for (int i = 0; i < NIter; ++i) { if (0 == CFCalendarAddComponents(calendar, &at, options, "d", 1)) { assert(0 && "uh-oh"); } CFDateRef date = CFDateCreate(0, at);
It is measured 33% faster than Foundation. It is even faster if you do not need to create CFDates and just store CFAbsoluteTime values.
source share