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
, BaseViewController
và DetailViewModel
đề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
vâng, đã thử điều đó. nó không hoạt động: ( –