与方向更改相关的EXC_BAD_ACCESS / KERN_INVALID_ADDRESS

时间:2013-04-04 14:28:48

标签: objective-c cocoa-touch uikit uideviceorientation

我有一个奇怪的问题。我收到一条错误报告,说该应用程序崩溃与方向更改有关。问题是我还没有在应用程序代码中注册任何方向事件。与方向改变有关的唯一事情是:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return IS_IPAD ? YES : interfaceOrientation == UIInterfaceOrientationPortrait;
}

...在所有视图控制器上确保它在iPad上改变方向而不是iPhone。错误发生在iPhone上。

IS_IPAD来自:

#ifdef UI_USER_INTERFACE_IDIOM
    #define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#else
    #define IS_IPAD (false)
#endif

似乎-[UIWindow _updateInterfaceOrientationFromDeviceOrientation:]调用了一些不再存在的对象。如果我没有注册任何与方向相关的通知,那会是什么对象?

enter image description here enter image description here

2 个答案:

答案 0 :(得分:-1)

您的堆栈跟踪显示NSNotificationCenter尝试明显通知对象方向更改。因此,您可能已注册此类对象,但它不再存在,并且在取消分配之前未注册。这可能会导致这样的错误。

答案 1 :(得分:-2)

您弃用的方法已弃用。方法shouldAutorotate是新的自转支持方法。我尝试了这个,它可以按你的意愿工作:

-(BOOL) shouldAutorotate{
    return IS_IPAD ? YES : [self preferredInterfaceOrientationForPresentation] == UIInterfaceOrientationMaskPortrait;
}

希望有所帮助:)