嗨,谢谢你。我遇到问题,当我在一个视图中启动NSTimer
然后切换到另一个UIPickerView
视图时,UIPickerView
的行为会受到影响。我在任何视图和包含NSTimer
的视图之间来回切换的越多,UIPickerView
的行为受到的影响就越大 - 它们滞后并且移动缓慢 - 最终达到了{{ {1}}不会调用UIPickerView
方法。这不只是一个DidSelectRow
受到影响,而是我应用中的所有UIPickerView
。
如果我决定不首先激活UIPickerView
,我的NSTimer
工作没有问题。但是,当我调用UIPickerViews
方法时,在包含NSTimer
的视图和任何其他视图之间切换回第四个可能六次之后,我的应用NSTimer
全部停止工作。为了恢复正常的行为,我需要关闭应用程序并重新启动它。
我正在使用UIPickerView
所以我不是手动发布ARC
- 但我认为这与我的问题有关。每次切换回包含NSTimer
的视图时,我猜测NSTimer
或其方法正在重复(没有被释放或取消分配)。无论如何,这是我的第二次努力编码,所以我不知道如何解决这个问题,虽然我已经读过NSTimer
和NSTimer
可以通过相同的UIPickerView
分配或线程,但我不确定这意味着什么。
无论如何,这是我的代码 - 它非常通用的样板代码。
NSRunLoop
答案 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和网上提供了大量关于这些问题的优秀文档: