2017-11-09 15 views
5

DetailViewControllerの割り当てを解除するときに、iOS 11デバイスでクラッシュを複製できません。iOS 11 EXC_BAD_ACCESS deallocのKERN_INVALID_ADDRESS

このアプリのDetailViewControllerは、BaseViewControllerから継承されています。 DetailViewControllerDetailViewModelプロパティを持っています。

DetailViewController,BaseViewControllerおよびDetailViewModelはすべてObjective-Cで書かれている。 SwiftのバージョンをSwift 4にアップグレードし、Swift Extensionを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) 
     } 
    } 

DetailViewModel迅速な拡張でfunc foo()が呼び出されず、それはまだのdeallocにクラッシュです。

誰に問題があるのか​​、それを修正する方法についてのアイデアはありますか?

はありがとう

スタックトレース:問題の複製を助けるために

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 

答えて

1

は、

+0

うん、それを試してみてください。それは動作しませんでした:( –

1

あなたがオブジェクトの配列に格納されているXcodeの9に住所消毒をオンにしてみてくださいオブジェクトが破棄され、配列を解放しているときに、オーバーリリースされます。

最初にzombie objectsを有効にすることができます(PLAYボタンの近くでターゲットをクリックし、scheme/Run/Diagnostics/Zombie objectsを選択してください)。このモードでは、オブジェクトは実際には解放されないため、オブジェクトを照会してクラッシュさせて、そのタイプを確認し、それを追跡することができます。

+0

答えをありがとう、しかし私たちはゾンビオブジェクトが有効になってそれを試して、我々は一度それをクラッシュさせるために誰かを得ることができたが、 –

関連する問題