Использование статической NSDate для определения времени прохождения - PullRequest
5 голосов
/ 31 января 2011

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

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

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

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

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

Ответы [ 4 ]

7 голосов
/ 31 января 2011

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

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

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

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

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

0 голосов
/ 31 января 2011

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

staticDate = [[NSDate date] retain];

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

0 голосов
/ 31 января 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];
}
0 голосов
/ 31 января 2011

Сбой в следующей строке?

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

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

...