[英]Xcode app on Simulator works, on real device crashes
I have a strange problem, whenever i run my app on the iPad simulator it works perfectly but if i try on a real device (iPad air iOS 7.0.4) it crashes while attempting this piece of code. 我有一个奇怪的问题,每当我在iPad模拟器上运行我的应用程序时,它都能正常运行,但是如果我在真实设备(iPad air iOS 7.0.4)上尝试,则在尝试这段代码时会崩溃。
I have : 我有 :
Nav controller embedded in a master detail split view controller (will call A) -> replace segue -> Nav控制器嵌入到主细节拆分视图控制器中(将调用A)->替换segue->
uitableViewController -> replace segue -> uitableViewController->替换segue->
someViewController (will call B) someViewController(将调用B)
and now.. replace segue back to the Nav Controller (all are master detail) and here it crashed on the real device giving only: (lldb) 现在..将segue替换回Nav控制器(所有都是主要细节),在这里它在真实设备上崩溃了,仅给出:(lldb)
now this is B implementation 现在这是B实现
- (IBAction)backToTable:(id)sender
{
id detail = self.splitViewController.viewControllers[1];
if(detail) { // iPad
[self performSegueWithIdentifier:@"backToTable" sender:self];
}
else // iPhone
[self dismissViewControllerAnimated:YES completion:nil];
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"backToTable"]){
ViewControllerA *destViewController = [[[segue destinationViewController] viewControllers] objectAtIndex:0];
destViewController.boolForSegue = @"true";
}
}
and this is A 这是一个
.h
@property (strong) NSString *boolForSegue;
.m
-(void)viewWillAppear:(BOOL)animated
{
if ([_boolForSegue isEqualToString:@"true"]){
[self unlockView];
}
}
- (void)unlockView
{
[self performSegueWithIdentifier:@"mySegue" sender:self];
}
I repeat that on simulator works perfectly no issue at all. 我再说一遍,在模拟器上完全没有问题。 What could be the problem??
可能是什么问题呢??
EDIT: 编辑:
crash log
Date/Time: 2014-02-06 23:00:34.420 +0100
OS Version: iOS 7.0.4 (11B554a)
Report Version: 104
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_INVALID_ADDRESS at 0x0000000153edbeb8
Triggered by Thread: 0
Thread 0 Crashed:
0 libobjc.A.dylib 0x00000001908879d0 objc_msgSend + 16
1 UIKit 0x00000001873fb09c -[UISearchBar willMoveToSuperview:] + 64
2 UIKit 0x00000001875d4ea0 __UIViewWillBeRemovedFromSuperview + 188
3 UIKit 0x00000001873043f0 -[UIView(Hierarchy) removeFromSuperview] + 68
4 UIKit 0x00000001873074f8 -[UIView dealloc] + 420
5 UIKit 0x00000001873eb350 -[UIScrollView dealloc] + 968
6 UIKit 0x00000001874abc3c -[UITableView dealloc] + 1300
7 UIKit 0x000000018749c108 -[UIViewController dealloc] + 460
8 UIKit 0x00000001875205f8 -[UITableViewController dealloc] + 288
9 UIKit 0x000000018782cdc4 -[UIStoryboardSegue dealloc] + 68
10 libobjc.A.dylib 0x00000001908893d0 (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 520
11 CoreFoundation 0x000000018433589c _CFAutoreleasePoolPop + 24
12 UIKit 0x00000001872fde34 _wrapRunLoopWithAutoreleasePoolHandler + 72
13 CoreFoundation 0x00000001843f77dc __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 28
14 CoreFoundation 0x00000001843f4a64 __CFRunLoopDoObservers + 368
15 CoreFoundation 0x00000001843f4df0 __CFRunLoopRun + 760
16 CoreFoundation 0x0000000184335b34 CFRunLoopRunSpecific + 448
17 GraphicsServices 0x0000000189d1782c GSEventRunModal + 164
18 UIKit 0x00000001873740e4 UIApplicationMain + 1152
19 MasterSecurity 0x000000010006f688 main (main.m:16)
20 libdyld.dylib 0x0000000190e77a9c start + 0
Thread 1:
0 libsystem_kernel.dylib 0x0000000190f59ac8 kevent64 + 8
1 libdispatch.dylib 0x0000000190e5dd74 _dispatch_mgr_thread + 48
Thread 2:
0 libsystem_kernel.dylib 0x0000000190f72e74 __workq_kernreturn + 8
1 libsystem_pthread.dylib 0x0000000190ff17a4 start_wqthread + 0
Thread 3:
0 libsystem_kernel.dylib 0x0000000190f72e74 __workq_kernreturn + 8
1 libsystem_pthread.dylib 0x0000000190ff17a4 start_wqthread + 0
Thread 0 crashed with ARM Thread State (64-bit):
x0: 0x00000001701669c0 x1: 0x000000018798d5a1 x2: 0x0000000000000000 x3: 0x0000000000000000
x4: 0x0000000000000000 x5: 0x0000000000000000 x6: 0x0000000000000000 x7: 0x0000000000000000
x8: 0x0000000191a40750 x9: 0x0000000153edbea8 x10: 0x000011d61ce68cd1 x11: 0x000000050000000f
x12: 0x00000001703e35e0 x13: 0xbaddd0ad53edbead x14: 0x000000000000004c x15: 0x0000000170036440
x16: 0x00000001908879c0 x17: 0x00000001908a1b6c x18: 0x0000000000000000 x19: 0x000000012450fdc0
x20: 0x0000000124846a00 x21: 0x0000000191a7f000 x22: 0x0000000124846a00 x23: 0x0000000191a83000
x24: 0x000000000000001e x25: 0x000000018798df25 x26: 0x0000000124513b40 x27: 0x0000000000000001
x28: 0x0000000191ac3550 fp: 0x000000016fda21c0 lr: 0x00000001873fb1d0
sp: 0x000000016fda21a0 pc: 0x00000001908879d0 cpsr: 0x20000000
In your A implementation, in viewWillAppear:
(before the view controller has finished appearing) you're calling a method that calls performSegueWithIdentifier:
, which will try to display another view controller. 在您的A实现中,在
viewWillAppear:
(在视图控制器完成显示之前),您正在调用一个方法,该方法调用performSegueWithIdentifier:
它将尝试显示另一个视图控制器。 You have to wait until the first segue has finished first. 您必须等到第一个会话首先完成。 So if you move that call to
viewDidAppear:
instead, it will fix your problem. 因此,如果将该调用移至
viewDidAppear:
它将解决您的问题。
Remember, don't try to display a view controller while another one is still in the process of being displayed. 请记住,不要试图在显示另一个视图控制器时显示它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.