在使用Instruments进行性能分析时出现了SIGSEGV(访问错误)错误

6
我正在尝试使用Instruments工具中的泄漏分析器来捕获内存泄漏和保留循环。然而,每当我在Instruments中点击记录按钮时,应用程序似乎开始然后崩溃。如果我从Xcode打开应用程序并将其转移到Instruments中,在我单击任何UIButton后,应用程序会崩溃。如果我从模拟器中打开应用程序,我可以得到第二个屏幕,但随后它也会崩溃。此外,应用程序在内存图中不显示任何泄漏,并且在正常使用时也不会崩溃。
以下是崩溃日志;

Exception Type: EXC_BAD_ACCESS (SIGSEGV) Exception Subtype: KERN_INVALID_ADDRESS at 0x0000000000000018 VM Region Info: 0x18 is not in any region. Bytes before following region: 4377985000 REGION TYPE START - END [ VSIZE] PRT/MAX SHRMOD REGION DETAIL UNUSED SPACE AT START --->
__TEXT 0000000104f2c000-0000000104fbc000 [ 576K] r-x/r-x SM=COW ...ti App Test]

Termination Signal: Segmentation fault: 11 Termination Reason: Namespace SIGNAL, Code 0xb Terminating Process: exc handler [0] Triggered by Thread: 0

Filtered syslog: None found

Thread 0 name: Dispatch queue: com.apple.main-thread Thread 0 Crashed: 0 libswiftCore.dylib 0x000000010597b2b4 0x1058cc000 + 717492 1 libswiftCore.dylib
0x000000010598823c 0x1058cc000 + 770620 2 UIFoundation
0x000000018f01fbdc attributeDictionaryHash + 460 3 Foundation
0x0000000185417edc hashProbe + 72 4 Foundation
0x0000000185417e7c -[NSConcreteHashTable getItem:] + 40 5
UIFoundation 0x000000018f01fd54 +[NSAttributeDictionary newWithDictionary:] + 136 6 Foundation 0x000000018542666c -[NSConcreteAttributedString initWithString:attributes:] + 124 7 My App Test
0x0000000104fbb894 0x104f2c000 + 587924 8 My App Test
0x0000000104fba588 0x104f2c000 + 583048 9 My App Test
0x0000000104fba494 0x104f2c000 + 582804 10 My App Test
0x0000000104fb9964 0x104f2c000 + 579940 11 My App Test
0x0000000104fb9830 0x104f2c000 + 579632 12 My App Test
0x0000000104fcb608 0x104f2c000 + 652808 13 My App Test
0x0000000104fccea4 0x104f2c000 + 659108 14 My App Test
0x0000000104fcc50c 0x104f2c000 + 656652 15 My App Test
0x0000000104fcc5a0 0x104f2c000 + 656800 16 UIKit
0x000000018df36bfc -[UIViewController loadViewIfRequired] + 1040 17 UIKit 0x000000018df367d4 -[UIViewController view] + 28 18 My App Test 0x0000000104f85b6c 0x104f2c000 + 367468 19 My App Test 0x0000000104f85470 0x104f2c000 + 365680 20 My App Test 0x0000000104f85688 0x104f2c000 + 366216 21 UIKit 0x000000018df6b20c -[UIApplication sendAction:to:from:forEvent:] + 96 22 UIKit 0x000000018df6b18c -[UIControl sendAction:to:forEvent:] + 80 23 UIKit 0x000000018df55f4c -[UIControl _sendActionsForEvents:withEvent:] + 440 24 UIKit 0x000000018df6aa80 -[UIControl touchesEnded:withEvent:] + 576 25 UIKit 0x000000018df6a5a0 -[UIWindow _sendTouchesForEvent:] + 2544 26 UIKit 0x000000018df65a70 -[UIWindow sendEvent:] + 3208 27 UIKit
0x000000018df37078 -[UIApplication sendEvent:] + 340 28 UIKit
0x000000018e876f98 dispatchPreprocessedEventFromEventQueue + 2364 29 UIKit 0x000000018e879408 __handleEventQueueInternal + 4760 30 UIKit 0x000000018e872574 __handleHIDEventFetcherDrain + 152 31 CoreFoundation 0x0000000184ad0358 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION + 24 32 CoreFoundation 0x0000000184ad02d8 __CFRunLoopDoSource0 + 88 33 CoreFoundation 0x0000000184acfb60 __CFRunLoopDoSources0 + 204 34 CoreFoundation 0x0000000184acd738 __CFRunLoopRun + 1048 35 CoreFoundation
0x00000001849ee2d8 CFRunLoopRunSpecific + 436 36 GraphicsServices
0x000000018687ff84 GSEventRunModal + 100 37 UIKit
0x000000018df9a880 UIApplicationMain + 208 38 My App Test
0x0000000104f97854 0x104f2c000 + 440404 39 libdyld.dylib
0x000000018451256c start + 4

Thread 1: 0 libsystem_kernel.dylib 0x0000000184641dbc __workq_kernreturn + 8 1 libsystem_pthread.dylib 0x0000000184753144 _pthread_wqthread + 1288 2
libsystem_pthread.dylib 0x0000000184752c30 start_wqthread + 4

Thread 2: 0 libsystem_pthread.dylib 0x0000000184752c2c start_wqthread + 0

Thread 3 name: com.apple.uikit.eventfetch-thread Thread 3: 0
libsystem_kernel.dylib 0x0000000184620bc4 mach_msg_trap + 8 1 libsystem_kernel.dylib 0x0000000184620a3c mach_msg + 72 2
CoreFoundation 0x0000000184acfce4 CFRunLoopServiceMachPort + 196 3 CoreFoundation 0x0000000184acd8b0 __CFRunLoopRun + 1424 4 CoreFoundation
0x00000001849ee2d8 CFRunLoopRunSpecific + 436 5 Foundation
0x00000001854166e4 -[NSRunLoop+ 50916 (NSRunLoop) runMode:beforeDate:] + 304 6 Foundation
0x0000000185435afc -[NSRunLoop+ 178940 (NSRunLoop) runUntilDate:] + 96 7 UIKit 0x000000018eae602c -[UIEventFetcher threadMain] + 136 8 Foundation 0x0000000185517860 __NSThread__start
+ 996 9
libsystem_pthread.dylib 0x000000018475432c _pthread_body + 308 10 libsystem_pthread.dylib 0x00000001847541f8 _pthread_body + 0 11 libsystem_pthread.dylib 0x0000000184752c38 thread_start + 4

Thread 4: 0 libsystem_pthread.dylib 0x0000000184752c2c start_wqthread + 0

Thread 5 name: com.apple.NSURLConnectionLoader Thread 5: 0
libsystem_kernel.dylib 0x0000000184620bc4 mach_msg_trap + 8 1 libsystem_kernel.dylib 0x0000000184620a3c mach_msg + 72 2
CoreFoundation 0x0000000184acfce4 CFRunLoopServiceMachPort + 196 3 CoreFoundation 0x0000000184acd8b0 __CFRunLoopRun + 1424 4 CoreFoundation
0x00000001849ee2d8 CFRunLoopRunSpecific + 436 5 CFNetwork
0x0000000185157b40 +[NSURLConnection+ 715584 (Loader) _resourceLoadLoop:] + 404 6 Foundation 0x0000000185517860 __NSThread__start
+ 996 7
libsystem_pthread.dylib 0x000000018475432c _pthread_body + 308 8 libsystem_pthread.dylib 0x00000001847541f8 _pthread_body + 0 9 libsystem_pthread.dylib 0x0000000184752c38 thread_start + 4

Thread 0 crashed with ARM Thread State (64-bit): x0: 0x00000001c4227ac0 x1: 0x000000018eca2db2 x2: 0x000000016aecf908 x3: 0x0000000000000000 x4: 0x0000000000000000 x5: 0x0000000000000020 x6: 0x0000000185426654 x7: 0x0000000000000130 x8: 0x0000000000000000 x9: 0x0000000000000000 x10: 0x0119490101194980 x11: 0x0000000001194901 x12: 0x0000000001194800 x13: 0x0000000000000001 x14: 0x0000000000000000 x15: 0x01194901011949c0 x16: 0x0000000000000000 x17: 0x0000000105988228 x18: 0x0000000000000000 x19: 0x00000001c4227ac0 x20: 0x00000001c4227ac0 x21: 0x00000001b5421000 x22: 0x00000001c0124f60 x23: 0x0000000000000000 x24: 0x00000001c0200730 x25: 0x0000000000000000 x26: 0x000000018eca3f46 x27: 0x00000001b3bca000
x28: 0x00000001c04578e0 fp: 0x000000016aecf4f0 lr: 0x000000010598823c sp: 0x000000016aecf4e0 pc: 0x000000010597b2b4 cpsr: 0x20000000

我搜索了一个月,不确定是否是Instruments的错误。我查看了以下帖子: Xcode Instruments: Leaks - App crashes on launch Instruments crashing while using Leaks instrument xcode instruments causing app crash 编辑:另一个崩溃日志。在这个日志中,我打开应用程序并将内存传输到Instruments工具,然后触摸UIView以打开一个新控制器。

Date/Time: 2018-07-06 15:13:34.5980 +0300 Launch Time: 2018-07-06 15:13:19.6298 +0300 OS Version: iPhone OS 11.0 (15A372) Baseband Version: 2.00.01 Report Version: 104

Exception Type: EXC_BAD_ACCESS (SIGSEGV) Exception Subtype: KERN_INVALID_ADDRESS at 0x0000000000000018 VM Region Info: 0x18 is not in any region. Bytes before following region: 4330094568 REGION TYPE START - END [ VSIZE] PRT/MAX SHRMOD REGION DETAIL UNUSED SPACE AT START --->
__TEXT 0000000102180000-00000001022a0000 [ 1152K] r-x/r-x SM=COW ...ti Filo Test]

Termination Signal: Segmentation fault: 11 Termination Reason: Namespace SIGNAL, Code 0xb Terminating Process: exc handler [0] Triggered by Thread: 0

Filtered syslog: None found

Thread 0 name: Dispatch queue: com.apple.main-thread Thread 0 Crashed: 0 libswiftCore.dylib 0x0000000102bdf278 0x102b30000 + 717432 1 libswiftCore.dylib
0x0000000102bec1b0 0x102b30000 + 770480 2 CoreFoundation
0x0000000184a3ec80 -[NSDictionary allKeys] + 108 3 UIKit
0x000000018e15738c -[NSDictionary+ 2294668 (UIStringDrawingKeyCompatibility) _ui_attributesForDictionaryContainingUIStringDrawingKeys] + 36 4 UIKit 0x000000018e09fde0 -[UINavigationBar setTitleTextAttributes:] + 144 5 My App Test
0x00000001021e82e8 0x102180000 + 426728 6 My App Test
0x00000001021e67c8 0x102180000 + 419784 7 My App Test
0x00000001021e6a14 0x102180000 + 420372 8 UIKit
0x000000018e5c3f78 -[UIGestureRecognizerTarget _sendActionWithGestureRecognizer:] + 64 9 UIKit 0x000000018e5c84dc _UIGestureRecognizerSendTargetActions + 124 10 UIKit 0x000000018e0b2dc8 _UIGestureRecognizerSendActions + 320 11 UIKit 0x000000018df67748 -[UIGestureRecognizer _updateGestureWithEvent:buttonEvent:] + 732 12 UIKit 0x000000018e5b23fc _UIGestureEnvironmentUpdate + 1056 13 UIKit
0x000000018e5b1f88 -[UIGestureEnvironment _deliverEvent:toGestureRecognizers:usingBlock:] + 404 14 UIKit 0x000000018e5b10e4 -[UIGestureEnvironment _updateGesturesForEvent:window:] + 276 15 UIKit 0x000000018df65a54 -[UIWindow sendEvent:] + 3180 16 UIKit
0x000000018df37078 -[UIApplication sendEvent:] + 340 17 UIKit
0x000000018e876f98 dispatchPreprocessedEventFromEventQueue + 2364 18 UIKit 0x000000018e879408 __handleEventQueueInternal + 4760 19 UIKit 0x000000018e872574 __handleHIDEventFetcherDrain + 152 20 CoreFoundation 0x0000000184ad0358 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION + 24 21 CoreFoundation 0x0000000184ad02d8 __CFRunLoopDoSource0 + 88 22 CoreFoundation 0x0000000184acfb60 __CFRunLoopDoSources0 + 204 23 CoreFoundation 0x0000000184acd738 __CFRunLoopRun + 1048 24 CoreFoundation
0x00000001849ee2d8 CFRunLoopRunSpecific + 436 25 GraphicsServices
0x000000018687ff84 GSEventRunModal + 100 26 UIKit
0x000000018df9a880 UIApplicationMain + 208 27 My App Test
0x00000001021facdc 0x102180000 + 503004 28 libdyld.dylib
0x000000018451256c start + 4

Thread 1: 0 libsystem_pthread.dylib 0x0000000184752c2c start_wqthread + 0

Thread 2: 0 libsystem_pthread.dylib 0x0000000184752c2c start_wqthread + 0

Thread 3: 0 libsystem_pthread.dylib 0x0000000184752c2c start_wqthread + 0

Thread 4 name: com.apple.uikit.eventfetch-thread Thread 4: 0
libsystem_kernel.dylib 0x0000000184620bc4 mach_msg_trap + 8 1 libsystem_kernel.dylib 0x0000000184620a3c mach_msg + 72 2
CoreFoundation 0x0000000184acfce4 CFRunLoopServiceMachPort + 196 3 CoreFoundation 0x0000000184acd8b0 __CFRunLoopRun + 1424 4 CoreFoundation
0x00000001849ee2d8 CFRunLoopRunSpecific + 436 5 Foundation
0x00000001854166e4 -[NSRunLoop+ 50916 (NSRunLoop) runMode:beforeDate:] + 304 6 Foundation
0x0000000185435afc -[NSRunLoop+ 178940 (NSRunLoop) runUntilDate:] + 96 7 UIKit 0x000000018eae602c -[UIEventFetcher threadMain] + 136 8 Foundation 0x0000000185517860 __NSThread__start
+ 996 9
libsystem_pthread.dylib 0x000000018475432c _pthread_body + 308 10 libsystem_pthread.dylib 0x00000001847541f8 _pthread_body + 0 11 libsystem_pthread.dylib 0x0000000184752c38 thread_start + 4

Thread 5 name: GAIThread Thread 5: 0 libsystem_kernel.dylib
0x0000000184620bc4 mach_msg_trap + 8 1 libsystem_kernel.dylib
0x0000000184620a3c mach_msg + 72 2 CoreFoundation
0x0000000184acfce4 CFRunLoopServiceMachPort + 196 3
CoreFoundation 0x0000000184acd8b0 __CFRunLoopRun + 1424 4 CoreFoundation 0x00000001849ee2d8 CFRunLoopRunSpecific + 436 5 Foundation
0x00000001854166e4 -[NSRunLoop+ 50916 (NSRunLoop) runMode:beforeDate:] + 304 6 Foundation
0x000000018546862c -[NSRunLoop+ 386604 (NSRunLoop) run] + 88 7 My App Test 0x000000010225b108 0x102180000 + 897288 8
Foundation 0x0000000185517860 __NSThread__start
+ 996 9 libsystem_pthread.dylib 0x000000018475432c _pthread_body + 308 10 libsystem_pthread.dylib 0x00000001847541f8 _pthread_body + 0 11 libsystem_pthread.dylib
0x0000000184752c38 thread_start + 4

Thread 6 name: com.apple.NSURLConnectionLoader Thread 6: 0
libsystem_kernel.dylib 0x0000000184620bc4 mach_msg_trap + 8 1 libsystem_kernel.dylib 0x0000000184620a3c mach_msg + 72 2
CoreFoundation 0x0000000184acfce4 CFRunLoopServiceMachPort + 196 3 CoreFoundation 0x0000000184acd8b0 __CFRunLoopRun + 1424 4 CoreFoundation
0x00000001849ee2d8 CFRunLoopRunSpecific + 436 5 CFNetwork
0x0000000185157b40 +[NSURLConnection+ 715584 (Loader) _resourceLoadLoop:] + 404 6 Foundation 0x0000000185517860 __NSThread__start
+ 996 7
libsystem_pthread.dylib 0x000000018475432c _pthread_body + 308 8 libsystem_pthread.dylib 0x00000001847541f8 _pthread_body + 0 9 libsystem_pthread.dylib 0x0000000184752c38 thread_start + 4

Thread 0 crashed with ARM Thread State (64-bit): x0: 0x00000001c4227c60 x1: 0x000000018eca2db2 x2: 0x0000000000000000 x3: 0x000000010637e8d0 x4: 0x0000000000000002 x5: 0x0000000000000020 x6: 0x00000001021e82e8 x7: 0x0000000000000b70 x8: 0x0000000000000000 x9: 0x0000000000000000 x10: 0x01446b0101446b80 x11: 0x0000000001446b01 x12: 0x0000000001446a00 x13: 0x0000000000000001 x14: 0x0000000000000000 x15: 0x01446b0101446bc0 x16: 0x0000000000000000 x17: 0x0000000102bec19c x18: 0x0000000000000000 x19: 0x00000001c4227c60 x20: 0x00000001c4227c60 x21: 0x00000001c4227c60 x22: 0x00000000000000d0 x23: 0x00000000000001f0 x24: 0x0000000000000008 x25: 0x00000001c4107740 x26: 0x00000001c40ca6b0 x27: 0x00000001c4093330
x28: 0x00000001b3f8f000 fp: 0x000000016dc7ce40 lr: 0x0000000102bec1b0 sp: 0x000000016dc7ce30 pc: 0x0000000102bdf278 cpsr: 0x20000000

编辑: 在@FranticRock的回答之后。当我删除[UINavigationBar setTitleTextAttributes:]详细类可以打开,但是没有任何项目(标题,返回按钮或任何单元格)显示。它们都是空的,我仍然得到泄漏。

这是控制器类,我在其中编写[UINavigationBar setTitleTextAttributes:]

class WelcomeViewController: BaseViewController {

let bgView = UIView()
let backgroundImage = UIImageView()

let logoImage: UIImageView = {
    let i = UIImageView()
    i.image = UIImage(named: "full_logo")
    i.contentMode = .scaleAspectFit
    return i
}()

let welcomeLabel : UILabel = {
    let l = UILabel()
    l.font = Fonts.font.withSize(24)
    l.textColor = UIColor.white
    l.textAlignment = .center
    l.numberOfLines = 0
    l.sizeToFit()
    return l
}()

let loginLbl: UILabel = {
    let l = UILabel()
    l.font = Fonts.font.withSize(13)
    l.textColor = UIColor.white
    l.textAlignment = .center
    l.numberOfLines = 0
    l.sizeToFit()
    return l
}()

let adminBtn: UIButton = {
    let b = UIButton()
    b.backgroundColor = Color.Common.buttonColor
    b.layer.cornerRadius = 6.0
    return b
}()

let userBtn: UIButton = {
    let b = UIButton()
    b.backgroundColor = Color.Common.buttonColor
    b.layer.cornerRadius = 6.0
    return b
}()

lazy var supportedServicesView = WelcomeScreenButtonView(text: getLabelText(key: CMSKeys.CMS_LBL_SUPPORTEDSERVICES), imageName: "phone")
lazy var incidentView = WelcomeScreenButtonView(text: getLabelText(key: CMSKeys.CMS_LBL_INCIDENT), imageName: "phone")
lazy var contactUsView = WelcomeScreenButtonView(text: getLabelText(key:CMSKeys.CMS_LBL_CONTACT), imageName: "phone")
lazy var moreView = WelcomeScreenButtonView(text: getLabelText(key:CMSKeys.CMS_LBL_MORE), imageName: "wdiger")

lazy var emergencyBtn = SendButton(text: "Button")

let firstStackView = UIStackView()
let secondStackView = UIStackView()
let thirdStackView = UIStackView()

let btnStackView = UIStackView()

override func viewDidLoad() {
    super.viewDidLoad()
    self.setPageID()
    designUI()
}

override func viewDidAppear(_ animated: Bool) {
    if(AppContext.instance.comesFromURL != nil){
        comesFromURL()
    }
}
override func viewWillAppear(_ animated: Bool) {
    if(analyticsName != nil){
        self.sendDataToGA()
    }
}

override func viewDidLayoutSubviews() {

    bgView.anchor(self.thirdStackView.topAnchor, left: self.view.leftAnchor, bottom: self.view.bottomAnchor, right: self.view.rightAnchor, topConstant: 40, leftConstant: 0, bottomConstant: 0, rightConstant: 0, widthConstant: 0, heightConstant: 0)

    let margins = view.layoutMarginsGuide
    thirdStackView.leadingAnchor.constraint(equalTo: margins.leadingAnchor,constant: 5).isActive = true
    thirdStackView.trailingAnchor.constraint(equalTo: margins.trailingAnchor,constant: -5).isActive = true
    thirdStackView.bottomAnchor.constraint(equalTo: self.emergencyBtn.topAnchor, constant: -10).isActive = true
    thirdStackView.heightAnchor.constraint(equalTo: thirdStackView.widthAnchor, multiplier: 0.77).isActive = true

    emergencyBtn.anchor(nil, left: self.view.leftAnchor, bottom: self.bottomLayoutGuide.topAnchor, right: self.view.rightAnchor, topConstant: 10, leftConstant: 20, bottomConstant: 20, rightConstant: 20, widthConstant: 0, heightConstant: 48)
    if #available(iOS 11.0, *) {
        logoImage.anchor(self.view.safeAreaLayoutGuide.topAnchor, left: self.view.leftAnchor, bottom: nil, right: self.view.rightAnchor, topConstant: 40, leftConstant: 80, bottomConstant: 0, rightConstant: 80, widthConstant: 0, heightConstant: 0)
    } else {
        logoImage.anchor(self.view.topAnchor, left: self.view.leftAnchor, bottom: nil, right: self.view.rightAnchor, topConstant: 40, leftConstant: 80, bottomConstant: 0, rightConstant: 80, widthConstant: 0, heightConstant: 0)
        // Fallback on earlier versions
    }
    logoImage.anchorCenterXToSuperview()
    let welcomeLblHeight = heightForView(text: "Welcome", font: welcomeLabel.font, width: self.view.bounds.width)
    let loginLblHeight = heightForView(text: "Please Log In", font: loginLbl.font, width: self.view.bounds.width)
    welcomeLabel.anchor(self.logoImage.bottomAnchor, left: self.view.leftAnchor, bottom: nil, right: self.view.rightAnchor, topConstant: 0, leftConstant: 50, bottomConstant: 0, rightConstant: 50, widthConstant: 0, heightConstant: welcomeLblHeight)
    loginLbl.anchor(self.welcomeLabel.bottomAnchor, left: self.view.leftAnchor, bottom: nil, right: self.view.rightAnchor, topConstant: 10, leftConstant: 50, bottomConstant: 0, rightConstant: 50, widthConstant: 0, heightConstant: loginLblHeight)
    btnStackView.anchor(nil, left: self.view.leftAnchor, bottom: self.thirdStackView.topAnchor, right: self.view.rightAnchor, topConstant: 0, leftConstant: 20, bottomConstant: 20, rightConstant: 20, widthConstant: 0, heightConstant: 50)

    backgroundImage.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height - self.bgView.frame.height)
}

private func designUI(){
    self.view.translatesAutoresizingMaskIntoConstraints = true
    backgroundImage.image = UIImage(named: "background.png")
    backgroundImage.contentMode = .scaleAspectFill
    self.view.insertSubview(backgroundImage, at: 0)

    bgView.backgroundColor = Color.Common.welcomeScreenBackgroundColor
    self.view.insertSubview(bgView, at: 1)
    view.addSubview(logoImage)
    welcomeLabel.text = getLabelText(key: CMSKeys.CMS_LBL_WELCOME)
    view.addSubview(welcomeLabel)
    loginLbl.text = getLabelText(key: CMSKeys.CMS_LBL_LOGIN)
    view.addSubview(loginLbl)

    adminBtn.backgroundColor = Color.Common.adminGreen
    adminBtn.setTitle(getLabelText(key: CMSKeys.CMS_BTN_ADMIN), for: .normal)
    adminBtn.addTarget(self, action: #selector(adminBtnTapped(_:)), for: .touchUpInside)

    userBtn.backgroundColor = Color.Common.userGreen
    userBtn.setTitle(getLabelText(key: CMSKeys.CMS_BTN_USER), for: .normal)
    userBtn.addTarget(self, action: #selector(userBtnTapped(_:)), for: .touchUpInside)

    btnStackView.axis  = UILayoutConstraintAxis.horizontal
    btnStackView.distribution = UIStackViewDistribution.fillEqually
    btnStackView.alignment = UIStackViewAlignment.fill
    btnStackView.spacing = 10.0
    btnStackView.addArrangedSubview(adminBtn)
    btnStackView.addArrangedSubview(userBtn)
    btnStackView.translatesAutoresizingMaskIntoConstraints = false
    self.view.addSubview(btnStackView)

    firstStackView.axis  = UILayoutConstraintAxis.vertical
    firstStackView.distribution = UIStackViewDistribution.fillEqually
    firstStackView.alignment = UIStackViewAlignment.fill
    firstStackView.spacing = 10.0
    firstStackView.addArrangedSubview(supportedServicesView)
    firstStackView.addArrangedSubview(contactUsView)
    firstStackView.translatesAutoresizingMaskIntoConstraints = false

    secondStackView.axis  = UILayoutConstraintAxis.vertical
    secondStackView.distribution = UIStackViewDistribution.fillEqually
    secondStackView.alignment = UIStackViewAlignment.fill
    secondStackView.spacing = 10.0
    secondStackView.addArrangedSubview(incidentView)
    secondStackView.addArrangedSubview(moreView)
    secondStackView.translatesAutoresizingMaskIntoConstraints = false

    thirdStackView.axis = UILayoutConstraintAxis.horizontal
    thirdStackView.distribution = UIStackViewDistribution.fillEqually
    thirdStackView.alignment = UIStackViewAlignment.fill
    thirdStackView.spacing = 10.0
    thirdStackView.addArrangedSubview(firstStackView)
    thirdStackView.addArrangedSubview(secondStackView)
    thirdStackView.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(thirdStackView)

    //View Tap Gestures
    let tapSupportedServices = UITapGestureRecognizer(target: self, action: #selector(self.tapSupportedServices(_:)))
    supportedServicesView.addGestureRecognizer(tapSupportedServices)
    supportedServicesView.isUserInteractionEnabled = true

    let tapIncidentView = UITapGestureRecognizer(target: self, action: #selector(self.tapIncident(_:)))
    incidentView.addGestureRecognizer(tapIncidentView)
    incidentView.isUserInteractionEnabled = true

    let tapContactUs = UITapGestureRecognizer(target: self, action: #selector(self.tapContactUs(_:)))
    contactUsView.addGestureRecognizer(tapContactUs)
    contactUsView.isUserInteractionEnabled = true

    let tapMoreView = UITapGestureRecognizer(target: self, action: #selector(self.tapMore(_:)))
    moreView.addGestureRecognizer(tapMoreView)
    moreView.isUserInteractionEnabled = true

    emergencyBtn.layer.cornerRadius = 6.0
    emergencyBtn.addTarget(self, action: #selector(emergenyBtnTapped(_:)), for: .touchUpInside)
    self.view.addSubview(emergencyBtn)

}

@objc func tapSupportedServices(_ sender: UITapGestureRecognizer) {
    let linkingVC = SupportedServicesFirstViewController()
    let controller = createNavController(title: "Services", viewController: linkingVC)
    self.present(controller, animated: true)
}


override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

private func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{
    let label:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
    label.numberOfLines = 0
    label.lineBreakMode = NSLineBreakMode.byWordWrapping
    label.font = font
    label.text = text
    label.sizeToFit()

    return label.frame.height
}

//Gets a Title and a ViewController then returns a UINavigationController with attributes
private func createNavController(title: String, viewController: UIViewController) -> UINavigationController {
    viewController.view.backgroundColor = UIColor(red:0.87, green:0.87, blue:0.87, alpha:1.0)
    let navController = UINavigationController(rootViewController: viewController)
    navController.navigationBar.topItem?.title = title
    navController.navigationBar.barTintColor = Color.NavigationBar.tintColor
    navController.navigationBar.tintColor = UIColor.white
    //Fix: Leak
    navController.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: Color.NavigationBar.textColor]

    return navController
}

private func removeViews(){
    self.emergencyBtn.removeFromSuperview()
    self.incidentView.removeFromSuperview()
    self.moreView.removeFromSuperview()
    self.supportedServicesView.removeFromSuperview()
    self.contactUsView.removeFromSuperview()
}
deinit {
    print("Welcome Deinited")
    removeViews()
}
}

很可能你在分析时崩溃而平常不会崩溃的原因是分析使用了发布版本。 - matt
发布版中进行性能分析,这不是正确的方式吗? - Emre Önder
当然可以。但问题在于,这显然带出了一个线程问题,而调试版本没有;否则你只需从Xcode构建和运行时就会看到该问题。所以我的意思是,尝试更改方案,使构建和运行使用发布版本,并查看是否正确(即崩溃)。如果是这样,这与Instruments无关,现在您的问题就成为所有其他线程问题EXC_BAD_ACCESS崩溃问题的重复。但如果我错了,那么Leak工具可能有问题(您应该提交错误报告)。 - matt
EXC_BAD_ACCESS: 可能是因为某个对象在使用前被释放了,因为没有强引用它?我不知道 self.present(..) 是否会在之后保持强引用。只是猜测而已。UINavigationController 的 deinit 和 UINavigationBar 一起消失是有可能的。也许可以派生一个 UINavigationController,添加一个带有 print-line 的 deinit,看看它是否过早地被释放了。 - Fabian
2个回答

4
在第一个堆栈跟踪中,与以下相关的代码:[UINavigationBar setTitleTextAttributes:]。 它正在尝试通过在标题上设置文本属性来自定义导航栏。 您是否这样做了?您可以尝试将其注释掉,看看问题是否会消失?
从技术上讲,您所拥有的不是内存泄漏。 您正在访问已被解除分配的对象。 您可以做的另一件事是在运行方案上启用Zombie Objects,并查看是否可以获取有关哪个对象被解除分配的信息。
现在,如果以上任何堆栈跟踪都没有引导您到直接编写的任何代码,而且您说您已经使用了Memory Debug Graph工具并且没有发现任何强引用到您检查泄漏的任何对象,那么我会在这里使用更具创意的方法来查找问题。我通常使用的方法是排除法。开始注释您的控制器的大部分内容,直到只剩下空壳。每次都可以削减代码一半(记录性能),然后重新测试代码的哪个部分引用了已被解除分配的对象。
显然,由于正常的应用程序操作不会导致Bad Access异常,因此很可能与XCode / Instruments内部有关,但上面的setTitleTextAttributes看起来可疑,我首先会尝试缩小问题与导航栏相关的范围。您是否以某种方式处理导航层次结构或自定义navbar UI?
还要检查是否存在来自以前导航事件/实例的同一视图控制器的其他实例...听起来像是UI对象被解除分配,然后由异步进程稍后更新。
还要覆盖deinit { }方法并在其中放置一个打印语句,以检测所有相关对象的解除分配。这将有助于缩小哪个控制器正在被解除分配并稍后访问。
它发生在所有iOS版本/设备模型上还是仅在特定模型上?

我会在周一检查并写下详细信息。谢谢。 - Emre Önder
你的代码中,setTitleTextAttributes在哪里被执行?是在哪个View Controller的生命周期方法中?viewWillAppear,viewDidAppear等。你覆盖了deinit { print(“VC Deinit”)吗?你的视图控制器是否在调用setTitleTextAttributse代码之前被Deinit?如果是这样,为什么会Deinit?发布你的代码将会很有帮助。(你可以删除特定业务细节,只发布展现出相同问题的骨架代码)。 - FranticRock
我将其添加到两个控制器中,但对泄漏方面没有任何影响。 - Emre Önder
当您声明linkingVC时,它不是从storyboard中完成的吗?您是否在构造函数内完成所有VC init?您是否尝试将setTitleTextAttributes的调用推迟到present()完成块被调用的时候?也许VC在其生命周期早期设置标题属性时存在问题。另一个实验是:尝试强烈持有linkingVC和navController(堆变量)以使它们在呈现时不会被释放。这可能与您在没有解码器的init中创建控制器的方式有关。 - FranticRock
尝试另一件事情:不要传递“linkingVC”,而是传递其他空白的VC,看看问题是否仍然存在。这将缩小问题范围,以确定它是否与“linkingVC”有关,还是与您呈现导航VC的方式有关。 - FranticRock
显示剩余3条评论

0

这个问题涉及到两个方面。第一个是为什么分析工具失效,第二个是为什么你的应用程序存在使用后释放问题。

@FranicRock提供了关于第二个问题的很好的建议。

对于分析问题,我的建议是尝试一种解决方法。如果你的应用程序可以使用(截至撰写本文时)Beta Xcode 10.0编译,则可以进入“编辑模式”(Command-<),在运行操作的诊断选项卡中,单击Logging Malloc Stack并选择子选项All Allocation and Free History。然后你可以:

  1. 在模拟器中运行你的应用程序。
  2. 在调试器区域中按下内存图标(第8个图标,看起来像三个连接在一起的圆圈)。
  3. 执行文件->导出内存图。

你可以自己研究内存图,也可以将其放在公共位置(如Pastebin)以供他人提供见解。苹果公司有一个关于这种新方法的信息视频:WWDC-2018-416-Memory-Deep-Dive


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接