【问题标题】:Using a Static NSDate to determine passing time使用静态 NSDate 确定通过时间
【发布时间】:2011-01-31 16:00:59
【问题描述】:

我正在尝试设置一个静态日期来确定每次调用此方法之间经过了多少秒。

瞬间崩溃!

-(无效)我的方法 { 静态 NSDate *staticDate = nil; NSTimeInterval 秒 = 0.0; 如果(静态日期) { NSLog(@"%@", staticDate); 秒 = [staticDate timeIntervalSinceNow]; } staticDate = [NSDate 日期]; NSLog(@"%.2f", 秒); }

【问题讨论】:

    标签: iphone objective-c macos static nsdate


    【解决方案1】:

    也许您最好使用timeIntervalSince1970,因为它是跨多种语言的常用方法。它将返回自 1970 年 1 月 1 日以来经过的秒数。

    设置一个实例变量来保存第一次时间间隔并将其初始化为[[NSDate date] timeIntervalSince1970]返回的值,然后你可以在你的方法中这样使用它:

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

    当前代码可能崩溃的一个可能原因是[NSDate date] 返回了一个自动释放的对象。即使变量是静态的,自动释放池也可能会释放日期对象,然后在您下次运行该方法时尝试访问它时导致崩溃。

    如果您创建一个新日期或保留从date 返回的日期,您或许可以避开这次崩溃。但是,将保留/拥有的对象分配给静态变量会导致内存泄漏,我建议您尝试我的解决方案。

    【讨论】:

      【解决方案2】:

      它会在以下行崩溃吗?

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

      因为 NSTimeIntervaldouble 类型的 typedef,而您的占位符指定了 float

      【讨论】:

      • 根据字符串格式说明符文档,%f 指定一个双精度。 "%f - 64 位浮点数(双精度)"
      • 它在没有任何错误消息的情况下崩溃。我的占位符应该是什么?
      【解决方案3】:

      试试这样的:

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

      【讨论】:

        【解决方案4】:

        您没有保留您创建的日期 - 您真正想要的:

        staticDate = [[NSDate date] retain];
        

        静态变量维护一个指针,如果你不保留指针,内存就会被释放,你什么也没有。

        【讨论】:

          猜你喜欢
          • 2012-02-03
          • 1970-01-01
          • 2011-08-07
          • 1970-01-01
          • 2023-03-19
          • 2013-10-09
          • 1970-01-01
          • 2011-09-12
          • 2023-03-31
          相关资源
          最近更新 更多