Использование статического NSDate для определения времени прохождения

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

Мгновенный сбой!

-(void) myMethod
{   
    static NSDate *staticDate = nil;
    NSTimeInterval seconds   = 0.0;

    if(staticDate)
    {   
        NSLog(@"%@", staticDate);
        seconds = [staticDate timeIntervalSinceNow];
    }

    staticDate = [NSDate date];
    NSLog(@"%.2f", seconds);
}

person Patricia    schedule 31.01.2011    source источник


Ответы (4)


Возможно, вам лучше использовать timeIntervalSince1970, поскольку это широко используемый метод на многих языках. Он вернет количество секунд, прошедших с 1 января 1970 года.

Настройте переменную экземпляра для хранения первого timeInterval и инициализируйте ее значением, возвращаемым [[NSDate date] timeIntervalSince1970], затем вы можете использовать ее в своем методе следующим образом:

-(void) myMethod
{
    NSTimeInterval seconds = [[NSDate date] timeIntervalSince1970] - _initialTimeInterval;
    NSLog(@"Seconds = %.2f", seconds);
}

Возможная причина, по которой ваш текущий код может дать сбой, заключается в том, что [NSDate date] возвращает автоматически выпущенный объект. Несмотря на то, что переменная статическая, пул автозапуска, вероятно, освобождает объект даты, а затем вызывает сбой при попытке доступа к нему при следующем запуске метода.

Вы можете обойти этот сбой, если создадите новую дату или сохраните дату, возвращенную из date. Однако присвоение сохраненного / принадлежащего объекта статической переменной приведет к утечке памяти, и я предлагаю вам попробовать вместо этого мое решение.

person Jasarien    schedule 31.01.2011

Вылетает на следующей строке?

NSLog(@"%.2f", seconds);

Поскольку NSTimeInterval является typedef для типа double, а ваш заполнитель указывает float.

person James Bedford    schedule 31.01.2011
comment
Согласно документации по спецификаторам формата строк,% f указывает двойное значение. % f - 64-битное число с плавающей запятой (double) - person Jasarien; 31.01.2011
comment
Он вылетает без каких-либо сообщений об ошибке. Что ДОЛЖНО быть моим заполнителем? - person Patricia; 31.01.2011

Попробуйте что-то вроде этого:

-(void) myMethod
{   

     static NSDate *staticDate = nil;
     if (staticDate == nil) staticDate = [[NSDate date] retain];

     if(staticDate)
     {   
     NSTimeInterval elapsedTime = fabs([staticDate timeIntervalSinceNow]);
     NSLog(@"elapsedTime == %.7f sec (%.4f ms)",
                    elapsedTime, elapsedTime * 1000.0); 
     }
     [staticDate release];
     staticDate = [[NSDate date] retain];
}
person NSGod    schedule 31.01.2011

Вы не сохраняете дату создания - вы действительно хотите:

staticDate = [[NSDate date] retain];

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

person Kendall Helmstetter Gelner    schedule 31.01.2011