NSTimer影响UIPickerView的行为

时间:2012-12-27 07:19:14

标签: ios cocoa-touch uipickerview nstimer

嗨,谢谢你。我遇到问题,当我在一个视图中启动NSTimer然后切换到另一个UIPickerView视图时,UIPickerView的行为会受到影响。我在任何视图和包含NSTimer的视图之间来回切换的越多,UIPickerView的行为受到的影响就越大 - 它们滞后并且移动缓慢 - 最终达到了{{ {1}}不会调用UIPickerView方法。这不只是一个DidSelectRow受到影响,而是我应用中的所有UIPickerView

如果我决定不首先激活UIPickerView,我的NSTimer工作没有问题。但是,当我调用UIPickerViews方法时,在包含NSTimer的视图和任何其他视图之间切换回第四个可能六次之后,我的应用NSTimer全部停止工作。为了恢复正常的行为,我需要关闭应用程序并重新启动它。

我正在使用UIPickerView所以我不是手动发布ARC - 但我认为这与我的问题有关。每次切换回包含NSTimer的视图时,我猜测NSTimer或其方法正在重复(没有被释放或取消分配)。无论如何,这是我的第二次努力编码,所以我不知道如何解决这个问题,虽然我已经读过NSTimerNSTimer可以通过相同的UIPickerView分配或线程,但我不确定这意味着什么。

无论如何,这是我的代码 - 它非常通用的样板代码。

NSRunLoop

2 个答案:

答案 0 :(得分:0)

我找到了解决方案。我在所有允许应用切换视图的方法中插入了代码[stopWatchTimer invalidate]。我很惊讶这是有效的,因为当我在viewDidLoad和viewDidUnload方法中包含[stopWatchTimer invalidate]时它没有任何效果......

答案 1 :(得分:0)

  

我找到了解决方案。我在所有允许应用切换视图的方法中插入了代码[stopWatchTimer invalidate]。

这或多或少会让任何人告诉你,因为:

  

我很惊讶这是有效的,因为当我在viewDidLoad和viewDidUnload方法中包含[stopWatchTimer invalidate]时它没有任何效果......

这些方法仅在特定场合调用:

加载视图控制器视图时会调用

viewDidLoad。 (不应该太惊讶......)

重要的是要了解load的含义:

当实例化视图控制器时 - 无论是来自NIB还是代码 - 它都没有视图。相反,它所拥有的是在被要求时如何为其提供服务的信息。

因此,当您将view消息发送到UIViewController时,它将确定是否已填充其_view实例变量。如果不是,它将调用自己的loadView方法,该方法将执行任何必要的操作以使用有意义的内容填充该实例变量。然后它会自己发送viewDidLoad消息,以完成它管理的视图层次结构的设置,然后才会返回_view的值。

这意味着viewDidLoad仅在视图控制器视图的整个生命周期内被调用一次。但这意味着什么?

在iOS 5及更早版本中,视图的生命周期与它是可见视图层次结构的一部分有关:当它不包含在一个中,并且它自己的视图控制器收到内存警告时,基本实现基本上看起来该视图是否具有超级视图,并且(如果不是)它将调用viewWillUnload,释放和nil out _view,并最终调用viewDidUnload来完成此过程。 (这就是为什么在一些糟糕的遗留代码库中,您可能会发现didReceiveMemoryWarning的覆盖不会调用super ...)

从iOS 6开始,UIViewController不再这样做了!

这就是为什么不推荐使用viewWillUnload和viewDidUnload的原因:视图一直存在,直到它的拥有视图控制器被处理掉,因此不再调用这些方法。

有了这个,清除计时器的相关情况是什么? 1. viewWillDisappear:你的观点即将“离开舞台”,所以当它在前面和中心时,只要拆掉相关的东西。 2.每当您要遮挡受定时器影响的部件时。这可能是因为您正在呈现另一个视图控制器,或者显示其他内容,如UIPickerView,它们隐藏了屏幕下方的大部分内容。 3.每当您需要重新配置/重置计时器时。 (没有做到这一点是你的应用程序首先戛然而止的原因。)

Xcode和网上提供了大量关于这些问题的优秀文档:

  • 对于iOS所有内容,View Contoller Programming Guide绝对是必读的。
  • NSTimer Class Reference和关联的随播指南非常好。请务必阅读概念部分 - 在“任务”部分之前。超过90%的任何根据NSTimer标签提出的问题(并且实际上与NSTimer有关)都不会被问到人们是否真的读过这个......