代码之家  ›  专栏  ›  技术社区  ›  Emre Önder

在仪器中分析时出现SIGSEGV(内存访问错误)错误

  •  5
  • Emre Önder  · 技术社区  · 8 年前

    我试图捕捉内存泄漏,并在仪器工具中使用泄漏探查器保留周期。然而,每当我点击仪器中的“录制”按钮时,应用程序似乎会先启动然后崩溃。如果我从Xcode打开应用程序并将其传输到Instruments,则在单击 UIButton . 如果我从模拟器打开应用程序,我可以得到第二个屏幕,但它也崩溃了。此外,应用程序不会显示任何内存泄漏图表,也不会崩溃正常使用。

    这是事故日志;

    异常类型:EXC_BAD_ACCESS(SIGSEGV)异常子类型:KERN_INVALID_ADDRESS at 0x0000000000000018 VM Region Info:0x18不是 在任何地区。以下区域之前的字节数:4377985000 区域类型开始-结束[VSIZE]PRT/MAX SHRMOD区域详细信息 开始时未使用的空间 --->
    __文本0000000 104f2c000-0000000 104fbc000[576K]r-x/r-x SM=COW…ti-App Test]

    终止信号:分段故障:11终止原因: 命名空间信号,代码0xb终止进程:exc处理程序[0]

    筛选的系统日志:未找到

    线程0名称:调度队列:com.apple.main-Thread线程0 崩溃:0 libswiftCore.dylib 0x000000010597b2b4 0x1058cc000+717492 1 libswiftCore.dylib
    0x000000010598823c 0x1058cc000+770620 2 UIFoundation公司
    0x000000018f01fbdc属性哈希+460 3基础
    0x0000000185417edc hashProbe+72 4基础
    0x0000000185417e7c-[NSConcreteHashTable获取项目:]+40 5
    基金会0x000000018f01fd54 +[NSAttributeDictionary newWithDictionary:+136 6基础0x000000018542666c-[NSConcreteAttributedString initWithString:属性:]+124 7我的应用程序测试
    0x0000000104fbb894 0x104f2c000+587924 8我的应用程序测试
    0x0000000104fba588 0x104f2c000+583048 9我的应用程序测试
    0x0000000104fba494 0x104f2c000+582804 10车型年款应用程序测试
    0x0000000104fb9964 0x104f2c000+579940 11我的应用程序测试
    0x0000000104fb9830 0x104f2c000+579632 12车型年款应用程序测试
    0x0000000104fcb608 0x104f2c000+652808 13车型年款应用程序测试
    0x0000000104fccea4 0x104f2c000+659108 14我的应用程序测试
    0x0000000104fcc50c 0x104f2c000+656652 15我的应用程序测试
    0x0000000104fcc5a0 0x104f2c000+656800 16套件
    0x000000018df36bfc-[UIViewController loadViewIfRequired]+1040 17 UIKit 0x000000018df367d4-[UIViewController 查看]+28 18我的应用程序测试0x0000000104f85b6c 0x104f2c000 +367468 19我的应用程序测试0x0000000104f85470 0x104f2c000+365680 20我的应用程序测试0x0000000104f85688 0x104f2c000+ 366216 21 UIKit 0x000000018df6b20c -[UIApplication sendAction:to:from:forEvent:+96 22 UIKit 0x000000018df6b18c-[uicontrolsendaction:to:forEvent:+80 23 UIKit 0x000000018df55f4c-[UIControl _sendActionsForEvents:withEvent:+440 24 UIKit 0x000000018df6aa80-[UIControl触摸:withEvent:+576 25 UIKit 0x000000018df6a5a0-[UIWindow _sendTouchesForEvent:+2544 26 UIKit 0x000000018df65a70-[UIWindow sendEvent:+3208 27 UIKit
    0x000000018df37078-[UI应用程序发送事件:]+340 28 UIKit
    0x000000018e876f98 dispatchPreprocessedEventFromEventQueue+2364调度预处理事件 29套件0x000000018e879408 __handleEventQueueInternal+4760 30 UIKit 0x000000018e872574\uuuu handleHIDEventFetcherDrain+152 31 核心基础0x0000000184ad0358 __CFRUNLOOP_正在调用_OUT_以执行_SOURCE0_函数 +24 32核心基础0x0000000184ad02d8\uu CFRunLoopDoSource0 +88 33 CoreFoundation 0x0000000184acfb60\u cfrunloopdosources 0+204 34 CoreFoundation 0x0000000184acd738\u CFRunLoopRun+1048 35 CoreFoundation
    0x00000001849ee2d8 CFRunLoopRunSpecific+436 36图形服务
    0x000000018687ff84 GSEventRunModal+100 37 UIKit
    0x000000018df9a880 UIApplicationMain+208 38我的应用程序测试
    0x0000000104f97854 0x104f2c000+440404 39 libdyld.dylib
    0x000000018451256c启动+4

    线程1:0 libsystem_kernel.dylib 0x0000000184641dbc __workq_kernreturn+8 1 libsystem_pthread.dylib 0x0000000184753144_pthread_wqthread+1288 2
    libsystem_pthread.dylib 0x0000000184752c30启动_wqthread+4

    线程2:0 libsystem_pthread.dylib 0x0000000184752c2 开始线程+0

    线程3名称:com.apple.uikit.eventfetch-Thread Thread 3:0
    libsystem_kernel.dylib 0x0000000184620bc4马赫信息陷阱+8 1 libsystem_kernel.dylib 0x0000000184620a3c马赫数消息+72 2
    核心基础0x0000000184acfce4 CFRunLoopServiceMachPort+196 3核心基础0x0000000184acd8b0\uu CFRunLoopRun+1424 4核心基础
    0x00000001849ee2d8 CFRunLoopRunSpecific+436 5基础
    0x00000001854166e4-[nsrunlop+50916(nsrunlop) 运行模式:早于日期:]+304 6基础
    0x0000000185435afc-[NSRunLoop+178940(NSRunLoop)runUntilDate:]+ 96 7 UIKit 0x000000018eae602c -[UIEventFetcher threadMain]+136 8基础0x0000000185517860线程启动
    +996 9年
    libsystem_pthread.dylib 0x000000018475432c_pthread_body+308 10 libsystem_pthread.dylib 0x00000001847541f8 _pthread_body+ 0 11 libsystem_pthread.dylib 0x0000000184752c38线程启动+ 四

    线程4:0 libsystem_pthread.dylib 0x0000000184752c2 开始线程+0

    线程5名称:com.apple.nsurlconnectionload线程5:0
    libsystem_kernel.dylib 0x0000000184620bc4马赫信息陷阱+8 1 libsystem_kernel.dylib 0x0000000184620a3c马赫数消息+72 2
    核心基础0x0000000184acfce4 CFRunLoopServiceMachPort+196 3核心基础0x0000000184acd8b0\uu CFRunLoopRun+1424 4核心基础
    0x00000001849ee2d8 CFRunLoopRunSpecific+436 5 CFNetwork
    0x0000000185157b40+[NSURLConnection+715584(加载程序) _resourceLoadLoop:+4046基础0x0000000185517860线程启动
    +9967个
    libsystem_pthread.dylib 0x000000018475432c_pthread_body+308 8 libsystem_pthread.dylib 0x00000001847541f8 _pthread_body+ 0 9 libsystem_pthread.dylib 0x0000000184752c38线程启动+ 四

    线程0因ARM线程状态(64位)而崩溃: x0:0x00000001c4227ac0 x1:0x000000018eca2db2 x2:0x000000016aecf908 x3:0x0000000000000000 x4:0x0000000000000000X5:0x0000000000000020 x6:0x0000000185426654 x7:0x0000000000000130 x8:0x0000000000000000 x9:0x0000000000000000 x10:0x0119490101194980 x11:0x0000000001194901 x12:0x0000000001194800 x13:0x0000000000000001 x14:0x0000000000000000 x15: 0x01194901011949c0 x16:0x0000000000000000x17:0x0000000105988228 x18:0x0000000000000000X19:0x00000001c4227ac0 x20: 0x00000001c4227ac0 x21:0x00000001B542100X22:0x00000001c0124f60 x23:0x0000000000000000 x24:0x00000001c0200730 x25: 0x0000000000000000x26:0x000000018eca3f46 x27:0x00000001b3bca000
    x28:0x00000001c04578e0 fp:0x000000016aecf4f0 lr: 0x000000010598823c sp:0x000000016aecf4e0 pc:0x000000010597b2b4 cpsr:0x20000000

    我找了一个月,不确定是不是仪器故障。我检查了下面的职位;

    Xcode Instruments: Leaks - App crashes on launch

    Instruments crashing while using Leaks instrument

    xcode instruments causing app crash

    编辑:另一个崩溃日志。在这个程序中,我打开应用程序并将内存传输到Instruments工具,然后触摸一个UIView top打开一个新控制器。

    日期/时间:2018-07-06 15:13:34.5980+0300发布时间:2018-07-06 15:13:19.6298+0300操作系统版本:iPhone操作系统11.0 (15A372)基带版本:2.00.01报告版本:104

    异常类型:EXC_BAD_ACCESS(SIGSEGV)异常子类型: KERN_无效的_地址位于0x0000000000000018虚拟机区域信息:0x18不是 在任何地区。以下区域之前的字节数:4330094568 区域类型开始-结束[VSIZE]PRT/MAX SHRMOD区域详细信息 开始时未使用的空间 --->
    __文本0000000 102180000-0000000 102240000[1152K]r-x/r-x SM=COW…ti-Filo测试]

    终止信号:分段故障:11终止原因: 命名空间信号,代码0xb终止进程:exc处理程序[0] 由线程触发:0

    筛选的系统日志:未找到

    线程0名称:调度队列:com.apple.main-Thread线程0 崩溃:0 libswiftCore.dylib 0x0000000102bdf278 0x102b30000+717432 1 libswiftCore.dylib
    0x0000000102bec1b0 0x102b30000+770480 2核心基础
    0x0000000184a3ec80-[NSDictionary allKeys]+108 3个UIKit
    0x000000018e15738c-[NSDictionary+2294668 (UIStringDrawingKeyCompatibility) _用户界面属性包含正在绘制的绘图键]+36 4用户界面工具包0x000000018e09fde0-[UINavigationBar setTitleTextAttributes:]+144 5我的应用程序测试
    0x00000001021e82e8 0x102180000+426728 6我的应用程序测试
    0x00000001021e67c8 0x102180000+419784 7我的应用程序测试
    0x00000001021e6a14 0x102180000+420372 8套件
    0x000000018e5c3f78-[UIGestureRecognizerTarget目标 _sendActionWithGestureRecognizer:]+64 9单元UIKit 0x000000018e5c84dc单元UIGestureRecognizerSendTargetActions+124 10 UIKit 0x000000018e0b2dc8 _UIGestureRecognizerSendActions+320 11 UIKit 0x000000018df67748-[UIGestureRecognizer识别器 _更新文件:buttonEvent:+732 12 UIKit 0x000000018e5b23fc UIGestureEnvironmentUpdate+1056 13 UIKit
    0x000000018e5b1f88-[UIGestureEnvironment(环境) _deliverEvent:ToGetRestureRecognizers:usingBlock:+404 14 UIKit 0x000000018e5b10e4-[UIGestureEnvironment _updateGesturesForEvent:窗口:]+276 15 UIKit 0x000000018df65a54-[UIWindow发送事件:]+3180 16 UIKit
    0x000000018df37078-[UI应用程序发送事件:]+340 17 UIKit
    0x000000018e876f98 dispatchPreprocessedEventFromEventQueue+2364调度预处理事件 18工具包0x000000018e879408 __handleEventQueueInternal+4760 19 UIKit 0x000000018e872574\uuuu handleHIDEventFetcherDrain+152 20 核心基础0x0000000184ad0358 __CFRUNLOOP_正在调用_OUT_以执行_SOURCE0_函数 +24 21 CoreFoundation 0x0000000184ad02d8\uu CFRunLoopDoSource0 +88 22核心基础0x0000000184acfb60\uu cfrunloopdosources 0+204 23核心基础0x0000000184acd738\uu CFRunLoopRun+1048 24核心基础
    0x00000001849ee2d8 CFRunLoopRunSpecific+436 25图形服务
    0x000000018687ff84 GSEventRunModal+100 26 UIKit
    0x000000018df9a880 UIApplicationMain+208 27我的应用程序测试
    0x00000001021facdc 0x102180000+503004 28 libdyld.dylib
    0x000000018451256c启动+4

    线程1:0 libsystem_pthread.dylib 0x0000000184752c2 开始线程+0

    线程2:0 libsystem_pthread.dylib 0x0000000184752c2 开始线程+0

    线程3:0 libsystem_pthread.dylib 0x0000000184752c2 开始线程+0

    线程4名称:com.apple.uikit.eventfetch-Thread线程4:0
    libsystem_kernel.dylib 0x0000000184620bc4马赫信息陷阱+8 1 libsystem_kernel.dylib 0x0000000184620a3c马赫数消息+72 2
    核心基础0x0000000184acfce4 CFRunLoopServiceMachPort+196 3核心基础0x0000000184acd8b0\uu CFRunLoopRun+1424 4核心基础
    0x00000001849ee2d8 CFRunLoopRunSpecific+436 5基础
    0x00000001854166e4-[nsrunlop+50916(nsrunlop) 运行模式:早于日期:]+304 6基础
    0x0000000185435afc-[NSRunLoop+178940(NSRunLoop)runUntilDate:]+ 96 7 UIKit 0x000000018eae602c -[UIEventFetcher threadMain]+136 8基础0x0000000185517860线程启动
    +996 9年
    libsystem_pthread.dylib 0x000000018475432c_pthread_body+308 10 libsystem_pthread.dylib 0x00000001847541f8 _pthread_body+ 0 11 libsystem_pthread.dylib 0x0000000184752c38线程启动+ 四

    线程5名称:GAIThread线程5:0 libsystem_kernel.dylib
    0x0000000184620bc4 mach_msg_trap+8 1 libsystem_kernel.dylib
    0x0000000184620a3c马赫数消息+72 2核心基础
    0x0000000184acfce4 CFRunLoopServiceMachPort+196 3个
    CoreFoundation 0x0000000184acd8b0\u CFRunLoopRun+ 1424 4核心基础0x00000001849ee2d8 CFRunLoopRunSpecific+4365基础
    0x00000001854166e4-[nsrunlop+50916(nsrunlop) 运行模式:早于日期:]+304 6基础
    0x000000018546862c-[nsrunlop+386604(nsrunlop)运行]+88 7车型年款 应用测试0x000000010225b108 0x102180000+897288 8
    基础0x0000000185517860线程启动
    +996 9 libsystem_pthread.dylib 0x000000018475432c _pthread_body+308 10 libsystem_pthread.dylib 0x00000001847541f8 _pthread_body+0 11 libsystem_pthread.dylib
    0x0000000184752c38线程开始+4

    线程6名称:com.apple.NSURLConnectionLoader线程6:0
    libsystem_kernel.dylib 0x0000000184620bc4马赫信息陷阱+8 1 libsystem_kernel.dylib 0x0000000184620a3c马赫数消息+72 2
    CoreFoundation 0x0000000184acfce4 CFRunLoopServiceMachPort+196 3核心基础0x0000000184acd8b0\uu CFRunLoopRun+1424 4核心基础
    0x00000001849ee2d8 CFRunLoopRunSpecific+436 5 CFNetwork
    0x0000000185157b40+[NSURLConnection+715584(加载程序) _resourceLoadLoop:+4046基础0x0000000185517860线程启动
    +9967个
    libsystem_pthread.dylib 0x000000018475432c_pthread_body+308 8 libsystem_pthread.dylib 0x00000001847541f8 _pthread_body+ 0 9 libsystem_pthread.dylib 0x0000000184752c38线程启动+ 四

    线程0因ARM线程状态(64位)而崩溃: x0:0x00000001c427c60 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:0x0000000000000000x17: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

    编辑: 在“弗兰蒂克洛克”的回答之后。当我删除时 [UINavigationBar setTitleTextAttributes:] detail类可以打开,但不显示任何项(title、back按钮或任何单元格)。它们都是空的,我还在漏水。

    这是我编写的控制器类 [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()
    }
    }
    
    2 回复  |  直到 8 年前
        1
  •  4
  •   FranticRock    8 年前

    在第一个堆栈跟踪中,有与以下相关的代码: [UINavigationBar setTitleTextAttributes:]
    它试图通过在标题上设置文本属性来自定义导航栏。你在这么做吗?你能不能试着把这个评论出来,看看问题是否解决了?

    从技术上讲,你所拥有的并不是内存泄漏。您正在访问已解除分配的对象。另一件事,你可以做的是启用僵尸对象,在你正在运行的方案,看看你是否可以得到信息,哪个对象得到解除分配。

    现在,如果上面的堆栈跟踪都没有指向您直接编写的任何代码,并且您说您已经使用了内存调试图工具,并且没有找到任何对正在检查泄漏的任何对象的强引用,我将在这里使用更具创造性的方法来查找问题。我经常使用的方法是消除。开始注释你的控制器的大部分,直到你只剩下空壳。每次,您都可以将代码减半(日志性能),并重新测试代码的哪个部分引用了已释放的对象。

    显然,由于正常的应用程序操作不会导致错误的访问异常,它可能与XCode/Instruments内部有关,但是 setTitleTextAttributes 上面看起来很可疑,我会先缩小这个问题是否与导航栏有关。您对导航层次结构或导航栏用户界面的自定义有什么奇怪的地方吗?

    还检查以前的导航事件/实例中是否存在相同的视图控制器的其他实例。听起来好像一个UI对象正在被释放,然后被一个异步进程更新。

    同时覆盖你的deinit{}。方法并将print语句放入其中,以检测正在释放的所有相关对象。这将有助于缩小范围,稍后将释放和访问哪个控制器。

    它是否出现在所有iOS版本/设备型号上或仅在特定型号上?

        2
  •  0
  •   Faisal Memon    8 年前

    这个问题提出了两个问题。第一个原因是分析被破坏,第二个原因是你的应用程序在释放问题之后有一个用途。

    @弗兰克罗克在第二个问题上提出了很好的建议。

    我对分析问题的建议是尝试一种解决方法。如果您的应用程序可以用Beta Xcode 10.0编译(编写时),那么您可以进入Edit Schema( Command-< )在运行操作的“诊断”选项卡中,单击 日志Malloc堆栈 有子选项 所有分配和自由历史记录 . 然后你可以:

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

    你可以自己研究记忆图,也可以把它放在像Pastebin这样的公共场所,让其他人提供见解。苹果有一个关于这种新方法的信息视频: WWDC-2018-416-Memory-Deep-Dive