Как зарегистрировать предупреждение, которое отображается как проблема времени выполнения в Xcode?
Xcode 8 или 9 начали отображать проблемы во время выполнения. Вы видите фиолетовый значок в верхней части окна и список в "Навигаторе проблем", рядом с проблемами времени сборки, такими как предупреждения компиляции и ошибки.
![введите описание изображения здесь]()
![введите описание изображения здесь]()
Проблемы со средой выполнения, которые я видел, создаются системными библиотеками. Есть ли способ для моего собственного кода приложения для их создания?
Ответы
Ответ 1
Смотрите здесь
После того, как вы развернули приложение, либо через App Store, либо как Ad Hoc или Enterprise, вы не сможете подключить к нему отладчик Xcode. Чтобы отлаживать проблемы, вам необходимо проанализировать выходы Crash Logs и Console с устройства.
Журналы аварийных сообщений Apple Watch будут доступны на сопряженном устройстве, а также могут быть получены с использованием методов, описанных ниже.
Подробнее о написании богатых операторов NSLog см. Улучшено ведение журнала в Objective-C.
Вставьте ниже пример кода в свой проект:
NSMutableArray *someObject = [NSMutableArray array];
NSLog(@"%s:%d someObject=%@", __func__, __LINE__, someObject);
[someObject addObject:@"foo"];
NSLog(@"%s:%d someObject=%@", __func__, __LINE__, someObject);
Ответ 2
Да! Вы увидите их, если вы сделаете что-то, что улавливает дезинфицирующее средство, например, выполняя определенные операции пользовательского интерфейса, фоновый поток с включенным фильтром Thread Sanitizer. Наличие двусмысленного макета и приостановка в отладчике представления также способ получить это. В любом случае, если это произойдет в библиотеках Apple, это не очень хорошо...
Ответ 3
Структура CocoaLumberjack может использоваться для захвата журналов консоли времени выполнения, а также журналов пробуждения в фоновом режиме.
https://github.com/CocoaLumberjack/CocoaLumberjack
https://github.com/phonegap/phonegap-plugin-push/issues/1988
Таким образом вы можете захватывать фиолетовые предупреждения, отображаемые в Xcode9, как показано ниже в файле, который поддерживается внутри контейнера приложений: -
=============================================== ==================
Main Thread Checker: API пользовательского интерфейса, вызываемый в фоновом потоке: - [UIApplication registerUserNotificationSettings:] PID: 2897, TID: 1262426, Название темы: (нет), Имя очереди: com.apple.root.default-qos, QoS: 21
Ответ 4
Это зависит от вас, если вы делаете какие-либо материалы, связанные с пользовательским интерфейсом, на другом, а затем на основном потоке, поэтому система будет генерировать для вас еще вы не сможете его вручную создать.
Все манипуляции с пользовательским интерфейсом должны выполняться в главной теме.
Если вы этого не сделаете, в XCode 9 есть функция Main thread checker.
Для получения дополнительной информации вы можете посетить приведенный ниже URL: https://developer.apple.com/documentation/code_diagnostics/main_thread_checker
В основном используется для проверки того, происходит ли какое-либо связанное с этим событие UIKit
в основном потоке или нет? Если это не удалось сделать, это вызовет проблемы во время выполнения. Поэтому оберните свой код в блоке Main Thread, как показано ниже, чтобы избежать сбоев и предупреждений во время выполнения.
Вы можете включить - отключить, используя эти шаги. Редактировать схему... → (выберите вашу схему) → Диагностика → Отключить 'Main thread checker'
Ответ 5
В XCode 8.3 и ранее вы можете использовать заданную точку останова в любом методе класса UIKit, например setNeedsDisplay()
, как показано ниже.
Также есть библиотека в классе objective-c steipete, в котором используется #import <objc/runtime.h>
.
![введите описание изображения здесь]()
Но в Xcode 9 ниже доступна библиотека Xcode.app/Contenets/Developer/usr/lib/libMainThreadChecker.dylib
, которая обрабатывает любые релевантные проблемы, потенциально выполняемые вне основного потока во время выполнения.