2013-02-19 20 views
5

Tôi đã nhìn thấy báo cáo sự cố này một vài lần. Nó cực kỳ ngẫu nhiên và hiếm hoi, và tôi không thể hiểu được. Tất cả tôi đang làm là trình bày một bộ điều khiển xem phương thức sử dụng đoạn mã sauTai nạn lạ khi trình bày phương thức UIViewController

ComposeController *newcontrol = [[ComposeController alloc]initWithMode:1 withNIB:@"ComposeController"]; 
newcontrol.delegate = self; 

UINavigationController *holder = [[UINavigationController alloc] initWithRootViewController:newcontrol]; 
[self presentViewController:holder animated:YES completion:NULL]; 

Bằng cách nào đó điều này dẫn đến này hoàn toàn ngẫu nhiên:

OS Version:  iPhone OS 6.1 (10B143) 
Report Version: 104 

Exception Type: SIGSEGV 
Exception Codes: SEGV_ACCERR at 0x9 
Crashed Thread: 0 

Thread 0 Crashed: 
0 libobjc.A.dylib      0x3b25c5d0 objc_msgSend + 16 
1 CoreFoundation      0x334ba73f -[__NSPlaceholderArray initWithObjects:count:] + 271 
2 CoreFoundation      0x334bae09 +[NSArray arrayWithObject:] + 45 
3 UIKit        0x353e80ab -[UIWindow _rotationViewControllers] + 51 
4 UIKit        0x353e7fe3 -[UIViewController viewControllerForRotation] + 91 
5 UIKit        0x353e7f39 -[UIViewController _visibleView] + 97 
6 UIKit        0x3546c05b -[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:] + 2483 
7 UIKit        0x3546afab -[UIViewController presentViewController:withTransition:completion:] + 3399 
8 MyApp        0x00046e97 -[Inbox composeHit] (Inbox.m:207) 

Trả lời

-2

Hãy thử làm điều này

[giữ pushViewController: newcontrol hoạt hình : CÓ hoàn thành: NULL];

4

Tôi có cùng một vấn đề khá nhất quán. Nó dường như được gây ra bởi thực tế là tôi đang trình bày một bộ điều khiển xem phương thức từ một popover, mà không được kiểm tra tốt và gây ra một lỗi trong mã của Apple. Lỗi này là UIKit giữ một tham chiếu không liên quan đến Trình điều khiển xem của tôi đã được loại bỏ và giải quyết, do đó, vào một thời điểm sau đó tham chiếu được nhấn. Cách giải quyết của tôi là tránh hiển thị các phương thức VC từ một cửa sổ bật lên hoặc để giữ lại tất cả các VC đó một cách vô hạn định (trong một biến thành viên hoặc một số biến thể như vậy).

Dưới đây là chi tiết đẫm máu.

Đây là mã tôi đã sử dụng để kích hoạt sự cố.

-(void) handlePinchFromCell:(AMPSupportingPhotoCell*) cell 
{ 
    UIViewController * vc = [[UIViewController alloc] init]; // UIViewController #0 
    [self presentViewController:vc animated:YES completion:nil]; 
    [self performSelector:@selector(dismiss:) withObject:vc afterDelay:2]; 
} 

-(void) dismiss:(UIViewController*)vc 
{ 
    [self dismissViewControllerAnimated:YES completion:^(){NSLog(@"-------");}]; 
} 

Mã này là một phần của một UIViewController # 1, có nghĩa là bên trong một UIPopoverController, đó là popped lên từ một UIViewController # 2, mà là chính nó một giới từ nhưng khác xem UIViewController # 3. Vụ tai nạn xảy ra sau khi popover bị đóng, id điều khiển # 2 bị loại bỏ.

Nếu tôi cho phép Zombies, tôi nhận được stack trace tương tự nhưng với một thông điệp:

2013-03-13 20:04:24.681 Mercury[16698:19d03] handlePinchFromCell: a225710 
2013-03-13 20:04:27.083 Mercury[16698:19d03] ------- 
2013-03-13 20:04:31.606 Mercury[16698:19d03] *** -[UIViewController retain]: message sent to deallocated instance 0xa225710 

Vì vậy, hãy chú ý rằng VC# 0 đã được phân bổ, trình bày, miễn nhiệm 2 giây sau, deallocated, và chưa có vẫn là một tham chiếu lơ lửng ở đâu đó trong mã của Apple. Khi cửa sổ popover bị đóng và VC# 2 bị loại bỏ, toàn bộ mọi thứ sẽ đổ xuống khi cố gắng truy cập vào VC được deal deal. Tôi khá chắc chắn đây là lỗi của Apple. Tôi cũng đoán nó liên quan đến việc trình bày một VC từ một cửa sổ pop, vì vậy nếu bạn tránh xa điều đó, hoặc giữ lại VC mình, bạn nên ổn.

Một dấu vết ngăn xếp khác cho cùng một vấn đề là điều này. Điều này xảy ra nếu mã ở trên được chạy hai lần:

2013-03-13 20:12:53.883 Mercury[16735:19d03] handlePinchFromCell: 16d54da0 
2013-03-13 20:12:56.285 Mercury[16735:19d03] ------- 
2013-03-13 20:13:03.481 Mercury[16735:19d03] handlePinchFromCell: a2565f0 
2013-03-13 20:13:03.481 Mercury[16735:19d03] *** -[UIViewController isKindOfClass:]: message sent to deallocated instance 0x16d54da0 
(lldb) bt 
* thread #1: tid = 0x1f03, 0x017f8a97 CoreFoundation`___forwarding___ + 295, stop reason = EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0) 
    frame #0: 0x017f8a97 CoreFoundation`___forwarding___ + 295 
    frame #1: 0x017f894e CoreFoundation`_CF_forwarding_prep_0 + 14 
    frame #2: 0x00c42f90 UIKit`-[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:] + 907 
    frame #3: 0x00a40ee3 UIKit`-[UIViewController presentViewController:withTransition:completion:] + 4521 
    frame #4: 0x00a41167 UIKit`-[UIViewController presentViewController:animated:completion:] + 112 
    frame #5: 0x0006c32d Mercury`-[AMPSupportingPhotosViewController handlePinchFromCell:](self=0x16d55360, _cmd=0x0007a64a, cell=0x0a22a2a0) + 205 at AMPSupportingPhotosViewController.m:184 
    frame #6: 0x015336b0 libobjc.A.dylib`-[NSObject performSelector:withObject:] + 70 
    frame #7: 0x0006f317 Mercury`-[AMPSupportingPhotoCell handlePinch:](self=0x0a22a2a0, _cmd=0x00efb0db, sender=0x0a2504a0) + 215 at AMPSupportingPhotoCell.m:53 
    frame #8: 0x00c2185a UIKit`_UIGestureRecognizerSendActions + 139 
+0

thực sự thú vị. Trong trường hợp của tôi, tôi đang trình bày một bộ điều khiển xem phương thức từ một bộ điều khiển xem phương thức khác. Cùng một vấn đề bạn nghĩ? Họ luôn luôn nhận được deallocated theo thứ tự đúng nhưng dựa trên những gì bạn đang nói nó có vẻ rằng nếu ai đó nói hit hủy bỏ trên bộ điều khiển phương thức đầu tiên và sau đó nhanh chóng nhấn hủy bỏ trên bộ điều khiển phương thức ban đầu có thể gây ra một vụ tai nạn? –

+0

Tôi nghĩ đó là điều tương tự - một VC bị kẹt ở đâu đó trong hệ thống của Apple. – DenNukem

Các vấn đề liên quan