在Xcode中,我有一个视图,它对标签栏控制器进行模态转换,标签栏中的第一个视图是UIViewController。此视图使用[self performSelector:@selector(blah :) withObject:nil afterDelay:15]在定时基础上(每15秒)执行一次任务。我有一些委托方法,让我回到根视图并调用[self dismissViewControllerAnimated],在我看来,它会卸载标签栏控制器,这将反过来每15秒卸载正在执行选择器的视图。当我调用dismissViewControllerAnimated后,这些视图确实消失了,选择器每15秒继续运行一次(我看到它们在Xcode控制台中记录消息)。我的逻辑是错误的,这些选择器应该停止,因为它们的viewcontroller已被卸载了吗?
答案 0 :(得分:1)
并非总是如此。这取决于你的类,如果你有一个强大的参考控制器或计时器,它可能实际上不会被释放。也可能是因为计时器从未失效,它会阻止视图控制器释放。定时器很有趣,因为它们可以导致这样的行为,如果没有失效,当你完成它们时,它们总是很好的清理它们。如果您使用递归每15秒调用一次定时方法,这也可能会使视图无法释放。
如果您正在使用计时器,则您希望在适当的时候使其无效,视图可能会消失。如果你想在视图消失后运行一次,你需要设置一个bool,这样你才知道视图何时消失,所以你可以再次运行它。
如果您正在使用递归,请务必小心。这样的东西可以无限期地在后台线程上运行。再次,如果您只希望它在视图是活动视图时运行,您可以检查以查看哪个视图位于顶部并且仅在该场景中递归调用该方法,或者设置bool on出现并消失并检查bool时该方法自称。