简体   繁体   English

iPhone 4和iPhone 5的单独的故事板仅在模拟器中导致崩溃

[英]Separate Storyboards for iPhone 4 and iPhone 5 Cause Crash in Simulator Only

I have 2 storyboards setup in my project, one for iPhone 4 and one for iPhone 5. 我的项目中设置了2个故事板,一个用于iPhone 4,一个用于iPhone 5。

I have setup the code to switch storyboards in - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions as follows: 我已经设置了以下代码来切换故事板-(BOOL)应用程序:(UIApplication *)应用程序didFinishLaunchingWithOptions:(NSDictionary *)launchOptions如下:

  CGSize iOSDeviceScreenSize = [[UIScreen mainScreen] bounds].size;

    if (iOSDeviceScreenSize.height == 480)
    {
        // Instantiate a new storyboard object using the storyboard file named Storyboard_iPhone4
        UIStoryboard *Storyboard_iPhone4 = [UIStoryboard storyboardWithName:@"Storyboard_iPhone4" bundle:nil];

        // Instantiate the initial view controller object from the storyboard
        UIViewController *initialViewController = [Storyboard_iPhone4 instantiateInitialViewController];

        // Instantiate a UIWindow object and initialize it with the screen size of the iOS device
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

        // Set the initial view controller to be the root view controller of the window object
        self.window.rootViewController  = initialViewController;

        // Set the window object to be the key window and show it
        [self.window makeKeyAndVisible];
    }

    if (iOSDeviceScreenSize.height >= 568)
    {   // iPhone 5 and iPod Touch 5th generation: 4 inch screen
        // Instantiate a new storyboard object using the storyboard file named Main
        UIStoryboard *Main2 = [UIStoryboard storyboardWithName:@"Main2" bundle:nil];

        UIViewController *initialViewController = [Main2 instantiateInitialViewController];
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        self.window.rootViewController  = initialViewController;
        [self.window makeKeyAndVisible];
    }
    else
    {
        UIStoryboard *Main2 = [UIStoryboard storyboardWithName:@"Main2" bundle:nil];
        UIViewController *initialViewController = [Main2 instantiateInitialViewController];
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        self.window.rootViewController  = initialViewController;
        [self.window makeKeyAndVisible];
    }

I will receive the following error when running on simulator only (iPhone 4 and iPhone 5 devices work and switch storyboards as expected): 仅在模拟器上运行时,我将收到以下错误(iPhone 4和iPhone 5设备可以正常工作并按预期切换情节提要):

Thread 1: EXC_BAD_ACCESS (code=2, address=0xc) 线程1:EXC_BAD_ACCESS(代码= 2,地址= 0xc)

This occurs here: 这发生在这里:

int main(int argc, char * argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

I am working in Xcode 5 currently. 我目前正在使用Xcode 5。

Here is the trace (not sure if I did this correctly): 这是跟踪(不确定我是否正确执行了此操作):

libobjc.A.dylib`objc_msgSend:
0x260e0a4:  movl   0x8(%esp), %ecx
0x260e0a8:  movl   0x4(%esp), %eax
0x260e0ac:  testl  %eax, %eax
0x260e0ae:  je     0x260e110                 ; objc_msgSend + 108
0x260e0b0:  movl   (%eax), %edx
0x260e0b2:  movzwl 0xc(%edx), %eax
0x260e0b6:  andl   %ecx, %eax
0x260e0b8:  shll   $0x3, %eax
0x260e0bb:  addl   0x8(%edx), %eax
0x260e0be:  cmpl   (%eax), %ecx
0x260e0c0:  jne    0x260e0c5                 ; objc_msgSend + 33
0x260e0c2:  jmpl   *0x4(%eax)
0x260e0c5:  cmpl   $0x0, (%eax)
0x260e0c8:  je     0x260e119                 ; objc_msgSend + 117
0x260e0ca:  cmpl   0x8(%edx), %eax
0x260e0cd:  je     0x260e0d9                 ; objc_msgSend + 53
0x260e0cf:  subl   $0x8, %eax
0x260e0d2:  cmpl   (%eax), %ecx
0x260e0d4:  jne    0x260e0c5                 ; objc_msgSend + 33
0x260e0d6:  jmpl   *0x4(%eax)
0x260e0d9:  movzwl 0xc(%edx), %eax
0x260e0dd:  shll   $0x3, %eax
0x260e0e0:  addl   0x8(%edx), %eax
0x260e0e3:  jmp    0x260e0f2                 ; objc_msgSend + 78
0x260e0e5:  cmpl   $0x0, (%eax)
0x260e0e8:  je     0x260e119                 ; objc_msgSend + 117
0x260e0ea:  cmpl   0x8(%edx), %eax
0x260e0ed:  je     0x260e0f9                 ; objc_msgSend + 85
0x260e0ef:  subl   $0x8, %eax
0x260e0f2:  cmpl   (%eax), %ecx
0x260e0f4:  jne    0x260e0e5                 ; objc_msgSend + 65
0x260e0f6:  jmpl   *0x4(%eax)
0x260e0f9:  pushl  %ebp
0x260e0fa:  movl   %esp, %ebp
0x260e0fc:  pushl  $0x0
0x260e0fe:  pushl  $0x0
0x260e100:  pushl  $0x0
0x260e102:  pushl  %edx
0x260e103:  pushl  %ecx
0x260e104:  movl   0x8(%ebp), %ecx
0x260e107:  pushl  %ecx
0x260e108:  calll  0x25fc720                 ; objc_msgSend_corrupt_cache_error
0x260e10d:  nopl   (%eax)
0x260e110:  xorl   %edx, %edx
0x260e112:  xorps  %xmm0, %xmm0
0x260e115:  xorps  %xmm1, %xmm1
0x260e118:  ret    
0x260e119:  movl   0x8(%esp), %ecx
0x260e11d:  movl   0x4(%esp), %eax
0x260e121:  pushl  %ebp
0x260e122:  movl   %esp, %ebp
0x260e124:  subl   $0xc, %esp
0x260e127:  pushl  %edx
0x260e128:  pushl  %ecx
0x260e129:  pushl  %eax
0x260e12a:  calll  0x260606f                 ; _class_lookupMethodAndLoadCache3
0x260e12f:  leave  
0x260e130:  cmpl   %eax, %eax
0x260e132:  jmpl   *%eax

So based on the image of the console the crash is because a message is sent to a deallloced instance. 因此,基于控制台的映像,崩溃是因为将消息发送到已取消处理的实例。 You can see from right about the lldb() it says [_UIDelayedPresentationContext delayingController] message sent to dealloced instance 您可以从右边看到关于lldb()的消息,该消息说[_UIDelayedPresentationContext delayingController]消息已发送到已取消分配的实例

I'm wondering what devices this crashes on in the simulator - does it crash on both 3.5 and 4 inch devices? 我想知道模拟器会在哪些设备上崩溃-它在3.5英寸和4英寸设备上都崩溃了吗?

One thing that pops out to me is that your first if statement kicks off the process to create a UIWindow and a UINavigationController along with it from the Storyboard_iPhone4 storyboard. 我突然想到的一件事是,您的第一个if语句启动了从Storyboard_iPhone4故事板创建UIWindow和UINavigationController以及该过程的过程。 Then immediately after that you have an if-else which does exactly the same thing but from a different storyboard. 然后紧接着是if-else,它执行完全相同的操作,但使用不同的故事板。 So if the device is not a 4 inch device you end up creating the window twice and I'm wondering if somehow that's the source of the crash. 因此,如果该设备不是4英寸设备,则最终会创建两次窗口,我想知道是否是崩溃的原因。 If you remove the first if statement does that change things? 如果删除第一个if语句,那会改变一切吗?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 为iPhone 4和5创建单独的故事板 - Create separate storyboards for iphone 4 and 5 应用程序仅在iPhone设备上崩溃而不在模拟器中崩溃 - App crash only on iPhone Device and not in Simulator Iphone模拟器崩溃 - Crash in Iphone Simulator 应用程序仅在iPhone设备上崩溃,而不在模拟器中崩溃-Xamarin绑定项目 - App crash only on iPhone Device and not in Simulator - Xamarin Binding project 如何在没有故事板的情况下以编程方式填充 iPhone X 模拟器的背景 - How to fill iPhone X Simulator's background programmatically without Storyboards Xcode 6 GM iPhone 6模拟器 - 没有正确调整大小的故事板,看起来放大了 - Xcode 6 GM iPhone 6 Simulator - Storyboards not sizing correctly, appear zoomed in Swift +故事板:iPad上的segue.identifier崩溃(iPhone正常) - Swift + Storyboards: segue.identifier crash on iPad (iPhone ok) 应用程序在模拟器中运行良好,但在 iphone 中崩溃 - app works well in simulator,But crash in iphone 我可以在iPhone和iPad(纵向和横向)上使用单独的故事板吗? - Can I use separate storyboards for iPhone and iPad(Portrait and Landscape)? Xcode 6.4模拟器仅显示iPhone 5,iPhone 6和iPhone 6 Plus - Xcode 6.4 simulator only shows iPhone 5, iPhone 6, and iPhone 6 Plus
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM