Отладка исключения добавленный Objective C и XCode

Установите кнопку в относительное положение, а затем примените значение left к наведению, как показано ниже:

    .arrow-right {
    /* STYLING */
    margin-left: 10px;
    border: solid #fff;
    border-radius: 1px;
    border-width: 0 3px 3px 0;
    display: inline-block;
    padding: 3px;
    transform: rotate(-45deg);
    -webkit-transform: rotate(-45deg);
    /* TRANSITION */
    -webkit-transition: 0.5s; /* Safari */
    transition: 0.5s;

    /* New Code */
    position:relative;
    left:0
}

.btn-primary:hover .arrow-right {
    left:5px
}

https://jsfiddle.net/du0rLphc/1/ [112 ]

10
задан Cœur 11 March 2019 в 05:13
поделиться

5 ответов

Прежде всего, открытый ~/.gdbinit (это - названный файл .gdbinit в Вашем корневом каталоге - да, запускается с точки), и поместите это в него:

fb -[NSException raise]
fb objc_exception_throw
fb malloc_error_break

Это инициализирует GDB с тремя точками останова по умолчанию, когда они произойдут, GDB остановит Ваше приложение и покажет Вам отслеживание стека. Это очень хорошо интегрируется с XCode, таким образом, Вы сможете приятно идти через свой код путем нажатия на элементы трассировки стека, как только исключение происходит где-нибудь, или malloc перестал работать.

Затем откройтесь Get Info панель на Вашем проекте (или выбор Ваш проект (главный объект в Groups & Files) и хит cmd-i), перейдите в Build вкладка и набор Ваш проект Base SDK кому: Device - iPhone OS [someversion]. Прокрутите полностью к нижней части и найдите GCC 4.0 - Warnings раздел. Там; включите столько предупреждений, сколько Вы чувствуете себя довольными в, но удостоверяетесь, что включили Treat Warnings as Errors (это - эквивалент GCC_TREAT_WARNINGS_AS_ERRORS). Лично, у меня есть он набор к этому:

GCC Warning Build Settings
(источник: lyndir.com)

Необходимо теперь получать предупреждения компилятора для большинства вещей, которые можно сделать неправильно в коде, и компилятор не позволит Вам выполнить код, пока Вы не зафиксируете их. Когда вещи действительно заканчивают нос компилятора, необходимо смочь найти проблему легко с GDB, повреждающимся в удобном месте.

Необходимо также изучить NSZombie*. Это переменные среды, которые очень удобны для раннего повреждения на плохом выделении памяти или ситуациях с доступом. Например; wih NSZombieEnabled ничто не будет действительно выпущено; на dealloc это будет перезаписано с _NSZombie и при попытке получить доступ к этой dealloced памяти снова (разыменовывающий dealloced указатель), Вы заставите что-то повреждаться на в GDB вместо вызова, проходящего как нормальный, только выпускаемого на случайных данных (который, конечно, не является тем, что Вы хотели). Для большего количества информации об этом см. http://www.cocoadev.com/index.pl?NSZombieEnabled.

25
ответ дан 3 December 2019 в 13:35
поделиться

Всегда используйте -Werror Установка GCC (GCC_TREAT_WARNINGS_AS_ERRORS = YES). У Вас никогда не должно быть предупреждений в Вашем коде, и это - пример, где предупреждение является критической ошибкой.

Кроме того, если Вы добираетесь objc_exception_throw, переключитесь на консоль (Command-shift-R) и ищите первый "низкий" адрес числа.

2009-04-01 13:25:43.385 CrashExample[41720:20b] Stack: (
    2528013804,
    2478503148,
    2528036920,
    2528053460,
    2358032430,
    11076,
    11880,
    816174880,
    345098340,
    145973440,
    816174880,
)

В этом случае это было бы "11076". Так вводят в консоли:

info line *11076

Это скажет Вам строку в Вашем коде, где исключение было выдано.

9
ответ дан 3 December 2019 в 13:35
поделиться

Параметры с орфографической ошибкой должны обычно приводить к "Предупреждению: такой-то и такой-то объект не отвечает на селектор x" в желтом в рассматриваемой строке. Я полагаю, что это идет по умолчанию, поскольку я не должен был изменять параметры компилятора для наблюдения их.

Кроме того, когда я встречаюсь с неперехваченным исключением, иногда выгодно заскочить в gdb консоль (должен подойти, когда Вы выполняете свое приложение), и введите следующее для получения следов для всех потоков:

t купленное

8
ответ дан 3 December 2019 в 13:35
поделиться

То, что Вы сделали, не является ошибкой времени компиляции, потому что проверки на этапе выполнения Objective C во времени выполнения, если объект может ответить на сообщение, Вы отправляете к нему.

Я рекомендую добавить эту установку сборки на Вашу цель или проект:

GCC_TREAT_WARNINGS_AS_ERRORS = YES
2
ответ дан 3 December 2019 в 13:35
поделиться

Причина это не ошибка компиляции, то, потому что это совершенно допустимо для отправки сообщения, не известного во время компиляции любому объекту (и любой объект может быть настроен для обработки сообщений динамично также). Все вызовы метода являются действительно сообщениями, отправляемыми в объекты.

В целом, если Вы видите какие-либо предупреждения, необходимо обратиться к ним, поскольку в большинстве случаев они могут привести к проблемам (как Вы видели). Вводящий в заблуждение аспект, вот то, что при компиляции файла однажды и он имеет только предупреждения при компиляции других классов, не внося изменения в класс, который имеет предупреждения, предупреждение не покажет в сообщениях компилятора. Таким образом, время от времени можно хотеть "убрать все цели" и сборку снова, чтобы удостовериться, что Вы не пропустили предупреждений.

1
ответ дан 3 December 2019 в 13:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: