2010-02-24 7 views
5

Tôi định kỳ reproing một vụ tai nạn trên một xây dựng gỡ lỗi chạy trên iPhone của tôi liên quan đến một UIScrollView không có mã của tôi trong khung stack. Tôi muốn biết nếu nó là một lỗi trong mã của tôi hoặc Apple, và tôi không thể truy vấn cơ sở dữ liệu lỗi của Apple để xem nếu nó đã được báo cáo. Backtrace hiển thị:Làm cách nào để xác định xem sự cố UIScrollView có nằm trong mã của tôi hay Apple không?

#0 0x30218060 in ___forwarding___() 
#1 0x3020eda0 in __forwarding_prep_0___() 
#2 0x309c4ce8 in -[UIScrollView(UIScrollViewInternal) _scrollViewAnimationEnded]() 
#3 0x3025af60 in -[NSObject performSelector:withObject:]() 
#4 0x3098ea94 in -[UIAnimator stopAnimation:]() 
#5 0x3098e5a8 in -[UIAnimator(Static) _advance:]() 
#6 0x3098e460 in LCDHeartbeatCallback() 
#7 0x32047fe8 in HeartbeatVBLCallback() 
#8 0x32a1c3ec in IOMobileFramebufferNotifyFunc() 
#9 0x3188a74c in IODispatchCalloutFromCFMessage() 
#10 0x3020d0b0 in __CFMachPortPerform() 
#11 0x30254a76 in CFRunLoopRunSpecific() 
#12 0x3025416a in CFRunLoopRunInMode() 
#13 0x320452a4 in GSEventRunModal() 
#14 0x308f037c in -[UIApplication _run]() 
#15 0x308eea94 in UIApplicationMain() 
#16 0x0000280c in main (argc=1, argv=0x2ffff58c) at /Users/esilver/Documents/Husband Material/main.m:14 

Vấn đề rõ ràng là trong UIScrollView(UIScrollViewInternal) _scrollViewAnimationEnded. GDB báo cáo:

-[MyViewController respondsToSelector:]: message sent to deallocated instance 0x5d77ad0 

Trong MyViewController, tôi có một cuộc gọi đến di chuyển một tableView:

[self.tableView scrollToRowAtIndexPath:scrollIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES]; 

Bởi vì nó sinh động, đó là rõ ràng có thể là quan điểm có thể nhận được popped tắt bộ điều khiển chuyển hướng trước khi di chuyển hoạt ảnh hoàn tất. Có vẻ như công việc của UIView phải hủy hoặc đợi cho bất kỳ thao tác cuộn đang chờ xử lý nào khi nó được dỡ xuống. Vì vậy, tôi nghĩ rằng đây là một lỗi trong mã của Apple.

Hoặc tôi có nhầm lẫn không và có một số loại kiểm tra chế độ xem của tôi phải kiểm tra xem nó có cuộn trước khi dỡ hàng hay tôi hoàn toàn hiểu sai sự cố này không?

FYI, lỗi này cũng chỉ xuất hiện để repro trong điều kiện bộ nhớ thấp, tức là tôi đã bắt đầu nhận được callReceiveMemoryWarning gọi lại.

Cảm ơn tất cả,

Eric

Trả lời

1

Lúc đầu, đại biểu phải là yếu/chỉ định loại. Nhưng sự kiện trong trường hợp này có một trở ngại rất phổ biến được điều khiển bởi hoạt ảnh cuộn. Nếu bạn sử dụng nội dung hoạt hình bù đắp những thay đổi cho ScrollViews bạn bạn mạnh mẽ, cần phải thiết lập đại biểu của nó-nil tại dealloc phương pháp.

Nếu không, bạn sẽ nhận được

sau
[YourViewController respondsToSelector:]: message sent to deallocated instance 

Ví dụ rất phổ biến:

1. _tableView is ivar of YourViewController 
2. _tableView.delegate = self; 
3. - (void)scrollViewDidScroll:(UIScrollView *)scrollView is implemented at YourViewController 
4. at some point you call [_tableView scrollToRowAtIndexPath:indexPath 
    atScrollPosition:UITableViewScrollPositionBottom animated:YES]; 
    or [_tableView setContentOffset:CGPoint animated:YES] 
    and try to close YourViewController 

Các _tableView được giữ lại bởi CoreAnimation, nhưng YourViewController được deallocated!