2017-11-09 23 views
5

Không thể sao chép sự cố trên thiết bị iOS 11 khi deallocating DetailViewController.iOS 11 EXC_BAD_ACCESS KERN_INVALID_ADDRESS trên dealloc

Ứng dụng có số DetailViewController được kế thừa từ BaseViewController. DetailViewController có thuộc tính DetailViewModel.

DetailViewController, BaseViewControllerDetailViewModel đều được viết trong Mục tiêu-C. Tôi đã nâng cấp phiên bản Swift lên Swift 4 và thêm Tiện ích mở rộng Swift vào DetailViewModel.

@objc extension DetailViewModel { 
     func foo() { 
      let conclusionBlock: (() -> Void) = { [weak self] in 
       guard let strongSelf = self else { return } 
       strongSelf.viewController.reloadData() 
      } 
      let viewModel = OtherViewModel(conclusionBlock: conclusionBlock) 
      let otherViewController = OtherViewController.make(viewModel: viewModel) 

      let nav = UINavigationController(rootViewController: otherViewController) 
      nav.modalPresentationStyle = .fullScreen 

      viewController.present(nav, animated: true, completion: nil) 
     } 
    } 

Nhìn vào các bản ghi, func foo() trong phần mở rộng nhanh chóng DetailViewModel không được gọi và nó vẫn đâm vào dealloc.

Có ai có ý tưởng về vấn đề hoặc cách khắc phục sự cố không?

Cảm ơn bạn

stack trace:

Crashed: com.apple.main-thread 
0 libobjc.A.dylib    0x18589d7f4 objc_object::release() + 16 
1 CoreFoundation     0x1862f3108 cow_cleanup + 112 
2 CoreFoundation     0x18623a51c -[__NSArrayM dealloc] + 68 
3 libobjc.A.dylib    0x18587eef4 object_cxxDestructFromClass(objc_object*, objc_class*) + 148 
4 libobjc.A.dylib    0x18588c638 objc_destructInstance + 88 
5 libobjc.A.dylib    0x18588c690 object_dispose + 16 
6 AppName      0x100c7dbec -[DetailViewModel .cxx_destruct] (DetailViewModel.m:43) 
7 libobjc.A.dylib    0x18587eef4 object_cxxDestructFromClass(objc_object*, objc_class*) + 148 
8 libobjc.A.dylib    0x18588c638 objc_destructInstance + 88 
9 libobjc.A.dylib    0x18588c690 object_dispose + 16 
10 AppName      0x100cbe358 -[DetailViewController .cxx_destruct] (DetailViewController.m:103) 
11 libobjc.A.dylib    0x18587eef4 object_cxxDestructFromClass(objc_object*, objc_class*) + 148 
12 libobjc.A.dylib    0x18588c638 objc_destructInstance + 88 
13 libobjc.A.dylib    0x18588c690 object_dispose + 16 
14 UIKit       0x18fb338f4 -[UIResponder dealloc] + 156 
15 UIKit       0x18f8e9e7c -[UIViewController dealloc] + 1776 
16 AppName      0x100c9b66c -[BaseViewController dealloc] (BaseViewController.m:56) 
17 AppName      0x100cb6570 -[DetailViewController dealloc] (DetailViewController.m:261) 
18 UIKit       0x18f9d3ec4 __destroy_helper_block_.150 + 80 
19 libsystem_blocks.dylib   0x185d91a60 _Block_release + 160 
20 UIKit       0x18fa5f5bc -[UIViewAnimationBlockDelegate .cxx_destruct] + 72 
21 libobjc.A.dylib    0x18587eef4 object_cxxDestructFromClass(objc_object*, objc_class*) + 148 
22 libobjc.A.dylib    0x18588c638 objc_destructInstance + 88 
23 libobjc.A.dylib    0x18588c690 object_dispose + 16 
24 CoreFoundation     0x18623d998 -[__NSDictionaryI dealloc] + 136 
25 libobjc.A.dylib    0x18589e138 (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 836 
26 CoreFoundation     0x186232050 _CFAutoreleasePoolPop + 28 
27 CoreFoundation     0x186311b04 __CFRunLoopRun + 2020 
28 CoreFoundation     0x1862322d8 CFRunLoopRunSpecific + 436 
29 GraphicsServices    0x1880c3f84 GSEventRunModal + 100 
30 UIKit       0x18f7df880 UIApplicationMain + 208 
31 AppName      0x100d59540 main (main.m:10) 
32 libdyld.dylib     0x185d5656c start + 4 

Trả lời

1

Để giúp tái tạo vấn đề này, hãy thử bật Địa chỉ Sanitizer trong Xcode 9.

+0

vâng, đã thử điều đó. nó không hoạt động: ( –

1

Bạn đã một đối tượng được lưu trữ trong một mảng đó là phát hành quá mức khi đối tượng bị phá hủy và giải phóng mảng của nó.

Trước tiên, bạn có thể kích hoạt zombie objects (nhét mục tiêu của bạn gần nút PHÁT, chọn scheme/Run/Diagnostics/Zombie objects). trong chế độ này, các đối tượng không thực sự được phát hành, vì vậy bạn có thể truy vấn đối tượng gây ra sự cố để xem loại của nó là gì và bắt đầu theo dõi nó.

+0

cảm ơn câu trả lời, nhưng chúng tôi đã thử nó với các đối tượng zombie được kích hoạt và chúng tôi quản lý để có được một ai đó để làm cho nó sụp đổ một lần, nhưng nó không kích hoạt bất cứ điều gì –

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