Tôi có ứng dụng SDK dành cho iPhone có một số chế độ xem xuất hiện và biến mất khi người dùng tạo nội dung. Sau khi sử dụng ứng dụng trên thiết bị trong một thời gian, tôi nhận được sự cố sau:Lỗi UIScrollView EXC_BAD_ACCESS trong SDK iOS
Program received signal: “EXC_BAD_ACCESS”.
(gdb) backtrace
#0 0x33369ebc in objc_msgSend()
#1 0x320e5248 in -[UIScrollView(UIScrollViewInternal) _scrollViewAnimationEnded]()
#2 0x338b4a14 in -[NSObject performSelector:withObject:]()
#3 0x320e5098 in -[UIAnimator stopAnimation:]()
#4 0x320e4b7c in -[UIAnimator(Static) _advance:]()
#5 0x320e4a34 in LCDHeartbeatCallback()
#6 0x34350e60 in HeartbeatVBLCallback()
#7 0x332e91c0 in IOMobileFramebufferNotifyFunc()
#8 0x316532f8 in ??()
#9 0x33866b50 in __CFMachPortPerform()
#10 0x338ae52a in CFRunLoopRunSpecific()
#11 0x338adc1e in CFRunLoopRunInMode()
#12 0x3434e1c8 in GSEventRunModal()
#13 0x32002c30 in -[UIApplication _run]()
#14 0x320in UIApplicationMain()
#15 0x00002ff8 in main (argc=1, argv=0x2ffff550) at /Developer/svn/MyCompany/iPhone/MyApplication/Other Sources/main.m:14
Như bạn có thể thấy từ theo dõi, chỉ đề cập đến mã của tôi trong đó là lời gọi đến chính.
Tôi đã chạy Build and Analyze từ Xcode, và cũng có thể thiết lập để chạy trình phân tích clang trên dự án của tôi từ Terminal, và cả hai không thể tìm thấy bất kỳ vấn đề nào trong mã. Tôi đang sử dụng phiên bản phát hành rất gần đây của SDK iOS (Tôi chưa tải xuống phiên bản 4.1, nhưng phiên bản tôi đang sử dụng là phiên bản đã được phát hành ngay trước 4.1).
Ngoài ra, tôi đã chạy ứng dụng trong Dụng cụ có Trình mô phỏng và ứng dụng không bị rò rỉ bộ nhớ.
Tôi sắp thử sử dụng biến số NSZombieEnabled
và xem có tìm thấy gì không, nhưng vấn đề là tôi cần sử dụng ứng dụng từ 30 đến 40 phút hoặc lâu hơn trước khi nó bị treo và tôi nghi ngờ rằng NSZombieEnabled
có thể không thậm chí giúp tôi tìm ra vấn đề.
Dường như các sự cố mà tôi đã thấy là khi chế độ xem phương thức gọi một đại biểu trong bộ điều khiển chế độ xem gốc. Trình điều khiển chế độ xem gốc sau đó thực hiện một số xử lý trước khi loại bỏ trình điều khiển chế độ xem phương thức. Có một số tài liệu tham khảo trong vụ tai nạn để xem hoạt hình và cuộn, nhưng tôi không chắc chắn những gì tôi có thể làm để làm cho những người có vấn đề. Có ai có bất cứ đề nghị cho những thứ để tìm?
EDIT: Tôi đã đặt NSZombieEnabled
cờ vào ứng dụng, và trên thiết bị, nó đi kèm với thông báo này trong giao diện điều khiển:
2010-09-11 17:10:33.970 MyApplication[9321:207] ***
-[MyViewController respondsToSelector:]: message
sent to deallocated instance 0x7489480
Theo như tôi có thể nói, tôi đang thiết các đại biểu được sử dụng trong ứng dụng để nil trong deallocs của tất cả các lớp học của tôi, vì vậy tôi bị mắc kẹt như là nơi để xem xét tiếp theo.
Tôi đã cố gắng sử dụng lệnh địa chỉ malloc_history
pid về điều này, nhưng nó nói rằng nó không thể tìm thấy quá trình, tôi đã thử 9321, 9321: 207 và 207. Ngoài ra, nếu tôi cố gắng sử dụng biến số MallocStackLogging
, chương trình sẽ không chạy trên thiết bị, tôi nhận được một bó số malloc:
không thể tạo thư mục ngăn xếp nhật ký ngăn xếp trong bảng điều khiển và sự cố chương trình. Ồ, và bằng cách này, tôi không thể sử dụng zombie kiểm tra trong Dụng cụ, vì nó dường như không hoạt động với một thiết bị, và tôi không thể xảy ra sự cố tương tự xảy ra trong Trình mô phỏng.
+1. Để rõ ràng, các thuộc tính ủy nhiệm phải luôn được đặt thành 'chỉ định' và không phải' giữ lại ' –
Luôn có một ngoại lệ đối với quy tắc. Xem 'NSURLConnection' để biết lý do hợp lệ để giữ lại một đại biểu. –
Tôi có một UITableView nằm trên một UIViewController, và khi ứng dụng bị treo, tôi tin rằng nó đã sẵn sàng để quay trở lại bộ điều khiển xem này. Tuy nhiên, đại biểu cho UITableView này được thiết lập trong Interface Builder, và nó không được thay đổi bất cứ nơi nào trong mã. –