我正在使用以下代码来检测/侦听iPad何时更改设备方向。

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(didRotate:)
                                                 name:@"UIDeviceOrientationDidChangeNotification"
                                               object:nil];

发生更改时,这将调用我的didRotate:方法。在我的didRotate:方法中,我使用UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];找出方向,然后相应地应用我的代码。

但是,在现实生活中的测试中,我注意到didRotate:如果将iPad放在人手中,每秒就会被调用一次。看来,收听者实际上是在监听iPad中的每一次微小倾斜和移动,这显然发生在一个人的手中(与平放在桌子上相反)。

关于如何解决此问题的任何想法?我可以更改代码以使用界面方向,但是由于任何原因我一直在遇到麻烦。谢谢。

* 更新:此侦听器在我的UIImageView子类中创建。屏幕上大约有十几个。我在删除实例时已将[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];添加到删除方法中。这有助于解释为什么didRotate一直显示这么多(我的错误)。

但是,我缩小了崩溃的范围:每当删除此子类的一个实例并旋转iPad时,我都会崩溃。有时我会收到诸如[__NSArrayM didRotate]:之类的奇怪消息:是无法识别的选择器(以及诸如UIPanVelocity之类的其他奇怪对象……某物)。删除实例后,我的侦听器还在听吗?

固定:谢谢您的帮助。我终于注意到哪里出了问题。我正在删除实例,但没有删除观察者并结束通知。在我的实例删除方法中添加以下代码可解决我的问题:
[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] removeObserver:self];

最佳答案

我猜想您会反复添加观察者,而不会删除它们。这意味着同一入口点可能会为单个事件多次调用。这也意味着,当“自我”对象消失时,您将崩溃。

10-05 20:22