Необъяснимый сбой с NSTimeInterval - PullRequest
1 голос
/ 02 ноября 2011

Кажется, я не могу обнаружить ошибку с изменением кода, которая приводит к серьезному сбою в моем приложении без большого количества отладочной информации.

Вот оригинальный метод

+ (NSArray *)currentReservations {
    NSTimeInterval interval = [[NSDate date] timeIntervalSince1970];
    double futureTimeframe = interval + SecondsIn24Hours;
    NSArray *reservations = [Reservation findWithSql:@"select * from Reservation where timestamp < ? and timestamp > ?" withParameters:[NSArray arrayWithObjects:[NSNumber numberWithDouble:ceil(futureTimeframe)], [NSNumber numberWithDouble:floor(interval)], nil]];
    return reservations;
}

Метод устанавливает несколько переменных, чтобы я мог запросить базу данных, чтобы найти все записи, которые имеют временные метки между настоящим моментом и 24 часами в будущем. Мне нужно изменить метод для запроса всех записей с метками времени между настоящим моментом и завтра (полночь следующего дня), поэтому я обновил код до этого на основе этого другого вопроса stackoverflow

+ (NSArray *)currentReservations {
    NSDate *today = [NSDate date];
    NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents *components = [[NSDateComponents alloc] init];
    [components setDay:1];  // tomorrow
    NSDate *tomorrow = [gregorian dateByAddingComponents:components toDate:today options:0];
//    [components release];  // dont think we need this release, but it is in the example here: /80505/est-li-luchshii-sposob-naiti-polnoch-zavtra
    NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
    components = [gregorian components:unitFlags fromDate:tomorrow];
    [components setHour:0];
    [components setMinute:0];
    NSDate *tomorrowMidnight = [gregorian dateFromComponents:components];
    [components release], components=nil;
    [gregorian release], gregorian=nil;


    NSTimeInterval interval = [today timeIntervalSince1970];
    NSTimeInterval tomorrowInterval = [tomorrowMidnight timeIntervalSince1970];

    NSArray *reservations = [Reservation findWithSql:@"select * from Reservation where timestamp < ? and timestamp > ?" withParameters:[NSArray arrayWithObjects:[NSNumber numberWithDouble:tomorrowInterval], [NSNumber numberWithDouble:floor(interval)], nil]];
    return reservations;
}

Однако, когда эти две строки:

    NSTimeInterval interval = [today timeIntervalSince1970];
    NSTimeInterval tomorrowInterval = [tomorrowMidnight timeIntervalSince1970];

включены сбои приложения. Я сузил его до этих двух строк, закомментировав их и т.д ..

Я в полном недоумении за то, что не так.

Ответы [ 2 ]

1 голос
/ 02 ноября 2011

Поскольку ваша трассировка стека аварийных ситуаций находится в objc_msgSend внутри _CFAutoreleasePoolPop, вы можете сделать вывод, что это, вероятно, ошибка чрезмерного выпуска.

Эта строка неверна:

[components release], components=nil;

Вы не делаетесобственные компоненты там.Посмотрите на название метода, который дал его вам.Вы преувеличиваете это.

0 голосов
/ 02 ноября 2011

Как сказал Роб Мейофф, второй релиз неправильный (хотя первый необходим).Попробуйте вместо этого:

+ (NSArray *)currentReservations {
    NSDate *today = [NSDate date];
    NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease];
    [components setDay:1];  // tomorrow
    NSDate *tomorrow = [gregorian dateByAddingComponents:components toDate:today options:0];
    NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
    components = [gregorian components:unitFlags fromDate:tomorrow];
    [components setHour:0];
    [components setMinute:0];
    NSDate *tomorrowMidnight = [gregorian dateFromComponents:components];
    [gregorian release], gregorian=nil;


    NSTimeInterval interval = [today timeIntervalSince1970];
    NSTimeInterval tomorrowInterval = [tomorrowMidnight timeIntervalSince1970];

    NSArray *reservations = [Reservation findWithSql:@"select * from Reservation where timestamp < ? and timestamp > ?" withParameters:[NSArray arrayWithObjects:[NSNumber numberWithDouble:tomorrowInterval], [NSNumber numberWithDouble:floor(interval)], nil]];
    return reservations;
}
...