1

我正在开发一个游戏,它为每个级别使用不同的控制器。它需要通过加速度计检测抖动,因此它将自己注册为委托,如下所示:

UIAccelerometer *accel = [UIAccelerometer sharedAccelerometer];
accel.delegate = self;
accel.updateInterval = kUpdateInterval; 

当关卡结束时,这个控制器会被释放并释放。以前,在释放此控制器后我遇到了崩溃,因为我没有取消 UIAccelerometer 上的委托(即它仍在向现在已释放的对象发送事件)。所以现在,在 dealloc 内部,我正在这样做:

UIAccelerometer *accel = [UIAccelerometer sharedAccelerometer];
accel.delegate = nil;

一切都很好,第一级比赛顺利进行。当我进入下一个级别时,会出现问题,创建一个新的级别控制器并再次运行第一批代码(现在将新控制器设置为委托)。在此之后,我没有收到来自加速度计的任何电话。

所以问题是,对于加速度计,您是否只允许每个应用程序有一个代表,或者我只是错过了什么?我在文档中没有看到任何不允许多次设置委托的内容。我对 Obj-C 有点陌生,但据我了解代表们,这不应该太不正统。

注意:我知道在 3.0 中我可以只收听震动通知。不幸的是,在我对摇晃感兴趣的整个过程中,我需要其他东西来成为第一响应者。所以我不能只重构那个选项。

4

2 回答 2

2

通常,具有委托的对象一次只有一个。除非另有说明,否则在特定实例的生命周期内将多个不同的对象设置为委托不应有任何限制。

我想知道发生了什么是在您将第二个控制器设置为加速器委托之后dealloc,您的第一个控制器正在被编辑。您是否使用调试器查看了该代码以确保一切都按照您期望的顺序发生?

于 2009-11-11T21:19:03.507 回答
2

一个可能的解决方案是让一个不同的类(可能是您的应用程序委托)充当 UIAccelerometer 的委托,并让该类在收到accelerometer:didAccelerate:消息时发送自定义的 NSNotification。您可以仅在检测到您关心的加速类型时发送消息,也可以每次发送通知并将 UIAcceleration 参数作为通知的一部分userInfo。您对加速度数据感兴趣的控制器可以根据需要注册通知。

于 2009-11-11T21:52:26.783 回答