在 While 循环中使用 NSDate

Posted

技术标签:

【中文标题】在 While 循环中使用 NSDate【英文标题】:Using NSDate in While loop 【发布时间】:2011-06-10 10:49:16 【问题描述】:

我想在 While 循环中使用 [NSDate date] 获取当前日期。我这样做是为了做到这一点:

while (interval > 0.0) 

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

不知道为什么Memory leaks 说明有大量的内存被泄露。请指导我完成任务的正确方法。

【问题讨论】:

这里有几个很好的答案;康斯坦丁指出了你的错误。 Andrei 指出了在循环中生成大量对象而不会耗尽自动释放池的问题。但是你也应该评估你的代码并确保你真的打算这样做。在上面的代码中,您正忙于等待,这意味着您正在消耗大量电池。等待的方式要少得多。最简单的是 NSTimer。也许这是为了显示一个观点的简化代码,但在循环中生成“现在”对象可能是错误的。 @Rob:我知道,但你认为 NSTimer 会与 PerformSelectorInBackground 一起使用吗?? 我不明白这个问题。仅仅因为你在“后台”运行并不意味着你可以忙着等待。它在任何线程上消耗相同数量的 CPU。你在这里解决什么问题? NSTimer 适用于处理其运行循环的任何线程。 就我对背景阅读的研究而言,我从来没有看到一个帖子批准 NSTimer 将在后台线程中工作,它只适用于主线程,这就是我试图完成它的原因用一个简单的while循环。如果您认为有另一种方法可以在不使用 While 和 NSTimer 的情况下完成此循环,请与我们分享。 NSTimers 在任何处理其运行循环的线程上工作。您可以阅读线程编程指南中的“启动运行循环”以获取有关如何管理后台线程上的运行循环以避免耗尽电池的更多信息:developer.apple.com/library/ios/#DOCUMENTATION/Cocoa/Conceptual/…。您还可以使用 GCD 和操作队列来阻止等待。请参阅并发编程指南。 developer.apple.com/library/mac/#documentation/General/….' 【参考方案1】:

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

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

【讨论】:

但是先生,我用 Leaks Performance 工具仔细检查了相同的代码,这表明内存正在持续消耗:( @Wasim:我可以说我写的代码没有内存泄漏。也许问题就在附近,但肯定不在这里。 好的,先生,我会再次检查并尽快回复您。非常感谢您的及时回复:)【参考方案2】:

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

NSDate *currentDate =  nil;

while (interval > 0.0) 

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

【讨论】:

那我将如何发布它?我在某处读到 NSDate 对象不需要释放,但是当我看到 Leaks Performance Tool 时,它清楚地表明大量内存正在泄漏。也请指导我。 [NSDate date]; 返回一个自动释放的对象。因此,在我的示例中,您无需释放 currentDate 还是一样的结果,内存一直在泄漏。如果我评论 NSDate 对象,那么内存泄漏就会停止,所以它足以清除泄漏的原因是同一个对象。 @Wasim,我不确定泄漏是如何发生的。但试试我更新的答案。它可能会解决您的问题。 @Wasim, @Simon:Simon 写的代码肯定没有内存泄漏。【参考方案3】:

问题不在于您本身在泄漏,而在于您在 while 循环中运行。

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

一种解决方案是在 while 范围内创建一个本地自动释放池

  while (foo) 
      NSAutoreleasePool *aPool = [[NSAutoreleasePool alloc ] init];
      NSDate *currentDate = [NSDate date];
      // other computational foo
      [aPool release]
  

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

【讨论】:

非常感谢兄弟。那对我来说很完美..!非常感谢:) 不用担心。不得不修复做这件事的一小段代码。这是一个运行等待循环,所以我们在等待线程结束时消耗越来越多的内存。 是的。在我的情况下,我也可以使用 sleepForTimeInterval 类型属性,因为我只想等待一段时间,然后执行剩余的任务。

以上是关于在 While 循环中使用 NSDate的主要内容,如果未能解决你的问题,请参考以下文章

js中for循环和while循环在使用的时候有何区别?

python(10):while循环

Shell while循环语句中的陷阱

如何在 Python 中的另一个 while 循环中正确地创建一个 while 循环?

退出循环break,在whilefordo...while循环中使用break语句退出当前循环,直接执行后面的代码。

在 NodeJS 中使用带有 SQL 请求的 While 循环