Ошибка SIGSEGV (плохой доступ к памяти) при профилировании в приборах - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь отследить утечку памяти и сохранить циклы с помощью Leak Profiler в инструменте инструментов.Однако всякий раз, когда я нажимаю кнопку записи в инструментах, приложение выглядит так, как будто оно запускается, а затем вылетает.Если я открою приложение из XCode и перенесу его в Instruments, приложение вылетает после нажатия любой из UIButton.Если я открою приложение из симулятора, я могу получить второй экран, но затем он также вылетает.Кроме того, приложение не показывает утечки в графике памяти, а также не вылетает при нормальном использовании.

Вот журнал сбоев;

Тип исключения: EXC_BAD_ACCESS (SIGSEGV) Подтип исключения: KERN_INVALID_ADDRESS по адресу 0x000000000000001818 Информация о регионе VM: 0x18 отсутствует в любом регионе.Байт перед следующим регионом: 4377985000 ТИП ОБЛАСТИ РЕГИОНА - ОКОНЧАНИЕ [VSIZE] PRT / MAX SHRMOD ДЕТАЛИ РЕГИОНА ИСПОЛЬЗУЕТСЯ ПРОБЕЛОМ НА СТАРТЕ --->
__TEXT 0000000104f2c000-0000000104fbc000 [576K] rx / rx SM = COW ... ti App Test]

Сигнал завершения: Ошибка сегментации: 11 Причина завершения: Пространство имен SIGNAL, код 0xb Процесс завершения: обработчик exc [0] Запуск по потоку: 0

Отфильтрованный системный журнал: не найден

Имя 0 потока: очередь отправки: com.apple.main-thread Поток 0 завершился с ошибкой: 0 libswiftCore.dylib 0x000000010597b2b4 0x1058cc000 + 717492 1 libswiftCore.dylib
0x000000010590023000000000000000000000000000000000000000000000000D-050x6400x6400x6400x0305x5305x5305x5305x5305x6400x6400000000000000000000000000D460 3 Фундамент
0x0000000185417edc hashProbe + 72 4 Фундамент
0x0000000185417e7c - [NSConcreteHashTable GetItem:] + 40 * 5 * 1020 UIFoundation 0x000000018f01fd54 + [NSAttributeDictionary newWithDictionary:] + 136 6 Фонд 0x000000018542666c - [NSConcreteAttributedString initWithString: аttributes:] + 124 7 мое приложение тест * +1021 * 0x0000000104fbb894 0x104f2c000 + 587924 8 мое приложение Тест * 1 022 * 0x0000000104fba588 0x104f2c000 + 583048 9 мое приложение тест
0x0000000104fba494 0x104f2c000 + 582804 10 мое приложение тест
0x0000000104fb9964 0x104f2c000 + 579940 11Тест моего приложения
0x0000000104fb9830 0x104f2c000 + 579632 12 Тест моего приложения
0x0000000104fcb608 0x104f2c000 + 652808 13 Тест моего приложения
0x0000000104fccea4 0x104f0 030 * 50 * 10 * 10 * 10 * 0 * 0 * 0 * 0 * 0 * 0 * 0 * 0 * 0 * 0 * 0 * 10 * 10 * 00x0000000104fcc5a0 0x104f2c000 + 656800 16 UIKit
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 - [UIControl sendAction: to:forEvent:] + 80 23 UIKit 0x000000018df55f4c - [UIControl _sendActionsForEvents: withEvent:] + 440 24 UIKit 0x000000018df6aa80 - [UIControl касается: завершено:]] + 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 * +1034 * + 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

Тема 1: 0 libsystem_kernel.dylib 0x000000018464x0000x_px_px_px_px_px_x_601042 * libsystem_pthread.dylib 0x0000000184752c30 start_wqthread + 4

Тема 2: 0 libsystem_pthread.dylib 0x0000000184752c2c start_wqthread + 0

Имя потока 3: com.apple.uit: uit: 0: * -ech: uit1047 * libsystem_kernel.dylib 0x0000000184620bc4 мach_msg_trap + 8 1 libsystem_kernel.dylib 0x0000000184620a3c mach_msg + 72 * 2 * CoreFoundation тысяча сорок восемь 0x0000000184acfce4 196 CFRunLoopServiceMachPort + 3 CoreFoundation 0x0000000184acd8b0 __CFRunLoopRun + 1424 4 CoreFoundation
0x00000001849ee2d8 CFRunLoopRunSpecific + 436 5 Фонд * * 0x00000001854166e4 тысяча пятьдесят-один - [NSRunLoop + 50916 (NSRunLoop) runMode: beforeDate:] + 304 6 Foundation
0x0000000185435afc - [NSRunLoop + 178940 (NSRunLoop) runUntilDate:] + 96 7 UIKit 0x000000018eae602c - [UIEventFetcher threadMain] + 136 8 Foundation 0x00500000000001.dylib 0x000000018475432c _pthread_body + 308 10 libsystem_pthread..apple.NSURLConnectionLoader Thread 5: 0
libsystem_kernel.dylib 0x0000000184620bc4 mach_msg_trap +-1 libsystem_kernel.dylib 0x0000000184620a3c mach_msg + 72 2
CoreFoundation 0x0000000184acfce4 * * CFRunLoopServiceMachPort тысячи шестьдесят-одиной + 196 3 CoreFoundation 0x0000000184acd8b0 __CFRunLoopRun + 4 CoreFoundation тысячи четыреста двадцать четыре * +1062 * 0x00000001849ee2d8 CFRunLoopRunSpecific + 436 5 CFNetwork
0x0000000185157b40 + [NSURLConnection + 715584 (погрузчик) _resourceLoadLoop:] + 404 6 Фонд 0x0000000185517860 __NSThread__start
+ 7 996
libsystem_pthread.dylib 0x000000018475432c _pthread_body + 308 8 libsystem_pthread.dylib 0x00000001847541f8 _pthread_body + 0 9 libsystem_pthread.dylib 0x0000000184752c38 thread_start + 4 * * * тысяче шестьдесят-шесть 1067 * Поток 0упал с государством ARM резьбой (64-битный): х0: 0x00000001c4227ac0 x1: 0x000000018eca2db2 x2: 0x000000016aecf908 x3: 0x0000000000000000 x4: 0x0000000000000000 х5: 0x0000000000000020 х6: 0x0000000185426654 х7: 0x0000000000000130 х8: 0x0000000000000000 x9: 0x0000000000000000 х10: 0x0119490101194980 x11: 0x0000000001194901 x12: 0x0000000001194800x13:0x0000000000000001 x14: 0x0000000000000000 x15: 0x01194901011949c0 х16: 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 Ф.П.: 0x000000016aecf4f0 lr:0x000000010598823c sp: 0x000000016aecf4e0 pc: 0x000000010597b2b4 cpsr: 0x20000000

Я искал это в течение месяца, и я не уверен, что это ошибка инструментов. Я проверил ниже сообщения;

Xcode Instruments: Leaks - приложение запускается при запуске

Сбои инструментов при использовании инструмента Leaks

xcode инструменты, вызывающие сбой приложения

РЕДАКТИРОВАТЬ: еще один журнал аварий. В этом я открою приложение и перенесу память в инструмент «Инструменты» и коснусь UIView сверху, чтобы открыть новый контроллер.

Дата / Время: 2018-07-06 15: 13: 34.5980 +0300 Время запуска: 2018-07-06 15: 13: 19.6298 +0300 Версия ОС: iPhone OS 11.0 (15A372) Версия основной полосы частот: 2.00.01 Версия отчета: 104

Тип исключения: EXC_BAD_ACCESS (SIGSEGV) Подтип исключения: KERN_INVALID_ADDRESS at 0x0000000000000018 VM Region Info: 0x18 не является в любом регионе. Байт перед следующим регионом: 4330094568 РЕГИОН ТИПА СТАРТ - КОНЕЦ [VSIZE] PRT / MAX SHRMOD РЕГИОН ДЕТАЛИ НЕиспользуемое пространство при старте --->
__TEXT 0000000102180000-00000001022a0000 [1152K] r-x / r-x SM = COW ... ti Filo Test]

Сигнал завершения: Ошибка сегментации: 11 Причина завершения: Пространство имен SIGNAL, код 0xb Процесс завершения: обработчик exc [0] Срабатывает по теме: 0

Отфильтрованный системный журнал: не найден

Имя потока 0: Очередь отправки: com.apple.main-thread Поток 0 Сбой: 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_attributesForDictionaryConistingUIStringDrawingKeys] + 36 4 UIKit 0x000000018e09fde0 - [UINavigationBar setTitleTextAttributes:] + 144 5 Тест моего приложения
0x00000001021e82e8 0x102180000 + 426728 6 Тест моего приложения
0x00000001021e67c8 0x102180000 + 419784 7 Тест моего приложения
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 рассылкаПереработаноEventFromEventQueue + 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 графических сервисов
0x000000018687ff84 GSEventRunModal + 100 26 UIKit
0x000000018df9a880 UIApplicationMain + 208 27 мое приложение тест
0x00000001021facdc 0x102180000 + 503004 28 libdyld.dylib
0x000000018451256c старт + 4

резьбы 1: 0 libsystem_pthread.dylib 0x0000000184752c2c start_wqthread+ 0

Поток 2: 0 libsystem_pthread.dylib 0x0000000184752c2c start_wqthread + 0

Поток 3: 0 libsystem_pthread.dylib 0x0000000184752c2c start_wqthread + 0

имя приложения. Thread *uikit.eventfetch-нить резьба 4: 0 * * 1 125 libsystem_kernel.dylib 0x0000000184620bc4 mach_msg_trap +-1 libsystem_kernel.dylib 0x0000000184620a3c mach_msg + 72 * 2 * 1 126 CoreFoundation 0x0000000184acfce4 * * CFRunLoopServiceMachPort тысячи сто двадцать семь + 196 3 CoreFoundation 0x0000000184acd8b0 __CFRunLoopRun + 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 Фонд 0x0000000185517860 __NSThread__start * * + тысяча сто тридцать-один 9 996
libsystem_pthread.dylib 0x000000018475432c _pthread_body + 308 10 libsystem_pthread.dylib 0x00000001847541f8 _pthread_body +0 11 libsystem_pthread.dylib 0x0000000184752c38 thread_start + 4

Имя потока 5: GAIThread Поток 5: 0 libsystem_kernel.dylib
0x0000000184620bc4 mach_msg_trap + 8 1 libsystem_kernel 1100 * 037 * 2-й псевдоним *1100* 030 * 2 037 * 2 630 * 6200 фунтов стерлингов * 6200 фунтов стерлингов * 6200 факс-фреймов0x0000000184acfce4 CFRunLoopServiceMachPort + 196 3
CoreFoundation 0x0000000184acd8b0 __CFRunLoopRun + +1424 4 CoreFoundation 0x00000001849ee2d8 CFRunLoopRunSpecific + 436 5 Фонд
0x00000001854166e4 - [NSRunLoop + 50916 (NSRunLoop) RunMode: beforeDate:] + 304 6 Фундамент
0x000000018546862c - [NSRunLoop + 386604 (NSRunLoop) запустить] + 88 7 My App Test 0x000000010225b108 0x102180000 + 897288 8
Фонд 0x0000000185517860 __NSThread__start
+ 996 9 libsystem_pthread.dylib 0x000000018475432c _pthread_body + 308 10 libsystem_pthread.dylib 0x00000001847541f8 _pthread_body + 0 11 libsystem_pthread.dylib * * 1 144 0x0000000184752c38 thread_start + 4

Тема 6 Название: com.apple.NSURLConnectionLoader тема 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 (погрузчик) _resourceLoadLoop:] + 404 6 Фонд 0x0000000185517860 __NSThread__start + 7 996
libsystem_pthread.dylib 0x000000018475432c _pthread_body + 308 8 libsystem_pthread.dylib 0x00000001847541f8 _pthread_body + 0 9 libsystem_pthread.dylib 0x0000000184752c38 thread_start + 4

тысяча сто пятьдесят пять * Поток 0 разбился с государством ARM резьбой (64-битный): х0: 0x00000001c4227c60 x1: 0x000000018eca2db2 x2: 0x0000000000000000 x3: 0x000000010637e8d0 x4: 0x0000000000000002 х5: 0x0000000000000020 х6: 0x00000001021e82e8 х7: 0x0000000000000b70 х8: 0x0000000000000000x9: 0x0000000000000000 x10: 0x01446b0101446b80 x11: 0x0000000001446b01 x12: 0x0000000001446a00x13: 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()
}
}

Ответы [ 2 ]

0 голосов
/ 13 июля 2018

Этот вопрос затрагивает две проблемы. Во-первых, почему профилирование не работает, а во-вторых, почему в вашем приложении возникает проблема использования после освобождения.

@ FranicRock предложила отличные предложения по второму вопросу.

Мое предложение по проблеме профилирования - попытаться обойти это. Если ваше приложение может быть скомпилировано с помощью (на момент написания) Beta Xcode 10.0, тогда вы можете перейти в Edit Schema (Command-<) и на вкладке Diagnostics для вашего действия Run. Нажмите Регистрация стека Malloc с подопция Все размещения и бесплатная история . Тогда вы можете:

  1. Запустите ваше приложение в симуляторе.
  2. Нажмите кнопку графика памяти в области отладчика (8-й значок, который выглядит как три круга, соединенные вместе)
  3. Do File-> Export Memory Graph.

Вы можете либо изучить график памяти самостоятельно, либо поместить его в общедоступное место, например Pastebin, для других, чтобы обеспечить понимание. У Apple есть информативное видео об этом новом подходе: WWDC-2018-416-Memory-Deep-Dive

0 голосов
/ 07 июля 2018

В первой трассировке стека есть код, относящийся к: [UINavigationBar setTitleTextAttributes:]
Он пытается настроить панель навигации, установив текстовые атрибуты в заголовке. Ты это делаешь? Можете ли вы попробовать это закомментировать и посмотреть, исчезнет ли проблема?

Технически то, что у вас есть, не является утечкой памяти. Вы получаете доступ к освобожденному объекту. Еще одна вещь, которую вы можете сделать, это включить объекты-зомби на схеме, которую вы используете, и посмотреть, сможете ли вы получить информацию о том, какой объект был освобожден.

Теперь, если ни одна из приведенных выше трассировок стека не приведет вас к какому-либо коду, который вы написали напрямую, и вы скажете, что вы уже использовали инструмент Memory Debug Graph и не нашли сильных ссылок на какие-либо объекты, которые вы проверяете на утечки, Я бы использовал более творческий подход, чтобы найти проблему. Подход, который я часто использую, - устранение. Начните комментировать большие части вашего контроллера, пока у вас не останется только пустая оболочка. Каждый раз вы можете разрезать код пополам (производительность журнала) и повторно проверить, какая часть кода ссылается на объект, который был освобожден.

Очевидно, что, поскольку нормальная работа приложения не приводит к исключению недопустимого доступа, оно, вероятно, связано с внутренними компонентами XCode / Instruments, однако setTitleTextAttributes выше выглядит подозрительно, и я сначала попытался бы сузить, является ли Проблема связана с панелью навигации. Вы делаете что-то странное с иерархией навигации или настройкой пользовательского интерфейса navbar?

Также проверьте, существуют ли другие экземпляры этого же View Controller в памяти из предыдущих событий / экземпляров навигации ... Похоже, что объект пользовательского интерфейса освобождается, а затем обновляется асинхронным процессом позже.

Также переопределите свой deinit {}. метод и поместить оператор печати внутри, чтобы обнаружить все связанные объекты, которые были освобождены. Это поможет выяснить, какой контроллер освобождается и к которому осуществляется доступ позже.

Это происходит на всех версиях iOS / моделях устройств или только на определенных моделях?

...