Как установить точку останова lldb в init класса objc - PullRequest
0 голосов
/ 04 ноября 2019

Я занимаюсь расследованием того, как был создан / представлен неправильный неправильно настроенный контроллер оповещений

Завершение работы приложения из-за необработанного исключения NSGenericException, причина: «Ваше приложение представило UIAlertController () стиля UIAlertControllerStyleActionSheet отUP.BVTabBarViewController (). ModalPresentationStyle UIAlertController с этим стилем - UIModalPresentationPopover. Вы должны предоставить информацию о местонахождении для этого всплывающего окна через контроллер popoverPresentationController контроллера оповещений. Вы должны предоставить либо sourceView и sourceRect, либо barButtonItem. Если эта информация неизвестна при представлении контроллера предупреждений, вы можете предоставить ее в методе UIPopoverPresentationControllerDelegate -prepareForPopoverPresentation.

Наивно я пробовал это:

(lldb)  br s -n "-[UIAlertController init]"
Breakpoint 100: no locations (pending).
WARNING:  Unable to resolve breakpoint to any actual locations.

Чтоправильный (рабочий) способ?

Ответы [ 2 ]

1 голос
/ 05 ноября 2019

Чтобы дать более общий ответ, для любого класса, который вы можете сделать:

br s -r '-\[UISomeClass init'
br s -r '\+\[UISomeClass '

Первый создает точку останова для любого метода, начинающегося с init. Второй соответствует всем методам класса и создает точки останова для каждого.

Существует один случай, который не охватывает ни один из подходов: методы суперкласса. Возможно, это не имеет значения для UIAlertController, но в целом точки останова могут быть установлены таким образом только для методов, которые реализует класс, а не для унаследованных методов.

1 голос
/ 04 ноября 2019

Если вы не делаете это совершенно неправильно, все ваши контроллеры оповещений создаются путем вызова

+[UIAlertController alertControllerWithTitle:message:preferredStyle:]

Однако эта точка останова действительно не нужна, и она вам не поможет, потому что вы выигралине встретите точку останова, если только вы не вызовете конкретное предупреждение, вызывающее проблему. Вместо этого просто поищите в вашем коде глобальный поиск .actionSheet и зафиксируйте тот, который не настроен как всплывающее окно.

Правило состоит в том, что на iPad все листы действий должны явно иметь вид источника или кнопку панели исходного кода. пункт, на который указывает стрелка;это сразу станет очевидным, когда вы придете к листу действий, для которого вы этого не делаете.

...