【问题标题】:NSDate : timeIntervalSinceNow crashNSDate : timeIntervalSinceNow 崩溃
【发布时间】:2012-01-24 21:15:59
【问题描述】:

我想在屏幕上显示自某个事件以来经过的时间。我有一个成员变量

NSDate *_startTime;

我像这样分配它(并启动一个计时器):

_startTime = [NSDate date];
_timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(clock) userInfo:nil repeats:YES];

我的时钟函数调用正常,但是当我尝试查找经过的时间时,我遇到了崩溃,无法确定发生了什么;我很容易得到EXC_BAD_ACCESS。下面是我如何尝试获取自引发异常的_startDate 以来经过的时间:

NSTimeInterval secondsElapsed = [_startTime timeIntervalSinceNow];

它在这条线上崩溃 - 我环顾四周,这似乎是正确的语法,这里发生了什么?

【问题讨论】:

    标签: iphone objective-c nsdate


    【解决方案1】:

    除非您使用 ARC,否则您需要拥有存储在 _startTime 中的 NSDate 对象的所有权。 +[NSDate date] 返回一个您不拥有的对象,它可能已被释放,因此在您发送 timeIntervalSinceNow 时无效。

    您可以像这样创建一个拥有的NSDate

    // By default, NSDates are initialized with the current date
    _startTime = [[NSDate alloc] init];
    

    或通过明确获取+date的返回值的所有权:

    _startTime = [[NSDate date] retain];
    

    它们在效果上是等价的。

    使用 setter 会更好(假设您为 _startTime 定义了一个属性(您应该这样做)):

    [self setStartTime:[NSDate date]];
    

    将属性定义为retaining,这将正确处理内存。

    【讨论】:

    • 谢谢 - P.s.如何将间隔输出为时间,即 01:30
    • P.p.s 为什么要为内部成员变量定义属性?
    • 一个NSTimeInterval代表秒;一分钟有60秒。使用除法和取模运算符,或ldiv() 函数。有很多关于 SO 的问题。
    • 为什么要定义一个属性?它使内存管理变得更加容易。没有它是可能的。也可以在“内部”类扩展中声明属性。
    • 感谢乔希的澄清
    【解决方案2】:

    你可能需要retain你的_startTime,否则它会被自动释放。 (当然,一旦你保留它,你有责任在以后释放它。)

    【讨论】:

      【解决方案3】:

      您没有保留_startTime,因此它可能在您的计时器触发时已被释放。

      【讨论】:

        【解决方案4】:

        [NSDate date] 将返回一个自动释放的对象。一旦超出范围,它将被释放。如果您想在“时钟”功能中使用它,则需要保留它。

        【讨论】:

          猜你喜欢
          • 2013-08-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多