在While循环中使用NSDate

时间:2011-06-10 10:49:17

标签: objective-c ios cocoa-touch ios4

我想在While循环中使用[NSDate date]获取当前日期。我通过这样做来实现这一目标:

while (interval > 0.0) {

    NSDate *currentDate = [[NSDate alloc] init];  
    currentDate =  [NSDate date];  
    interval = (float) [newDate timeIntervalSinceDate: currentDate] / 60;  
    [currentDate release];
}

我不知道为什么内存泄漏表明存在大量内存泄露。请指导我完成任务的正确方法。

3 个答案:

答案 0 :(得分:6)

在第NSDate *currentDate = [[NSDate alloc] init];行中,您将创建一个新对象,您应该将其释放。在行currentDate = [NSDate date];中,您不释放旧对象,只创建指向另一个对象的指针。在行[currentDate release];中,您释放在循环的第二行创建的对象,这可能会导致错误(该对象被标记为autorelease one,iOS将为您清除它)。您应该重写您的代码,如:

while (interval > 0.0) {
      NSDate *currentDate =  [NSDate date];
      interval = (float) [newDate timeIntervalSinceDate: currentDate] / 60;
}

答案 1 :(得分:4)

您不需要第一行NSDate *currentDate = [[NSDate alloc] init];。您可以直接将 [NSDate date] 分配给 currentDate

NSDate *currentDate =  nil;

while (interval > 0.0) {

    currentDate =  [NSDate date];
    interval = (float) [newDate timeIntervalSinceDate: currentDate] / 60;
}

答案 2 :(得分:3)

问题不在于你本身是在泄漏,而是在一个while循环中运行。

自动释放日期中自动发布的日期正在增长,因为该池仅在运行循环的空闲时间内清空。

一种解决方案是在while

范围内创建一个本地自动释放池
  while (foo) {
      NSAutoreleasePool *aPool = [[NSAutoreleasePool alloc ] init];
      NSDate *currentDate = [NSDate date];
      // other computational foo
      [aPool release]
  }

当您在本地范围内释放池时,它将立即删除您请求的自动释放日期。