Установите кнопку в относительное положение, а затем примените значение 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
}
Прежде всего, открытый ~/.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
). Лично, у меня есть он набор к этому:
(источник: lyndir.com)
Необходимо теперь получать предупреждения компилятора для большинства вещей, которые можно сделать неправильно в коде, и компилятор не позволит Вам выполнить код, пока Вы не зафиксируете их. Когда вещи действительно заканчивают нос компилятора, необходимо смочь найти проблему легко с GDB, повреждающимся в удобном месте.
Необходимо также изучить NSZombie*
. Это переменные среды, которые очень удобны для раннего повреждения на плохом выделении памяти или ситуациях с доступом. Например; wih NSZombieEnabled
ничто не будет действительно выпущено; на dealloc это будет перезаписано с _NSZombie
и при попытке получить доступ к этой dealloced памяти снова (разыменовывающий dealloced указатель), Вы заставите что-то повреждаться на в GDB вместо вызова, проходящего как нормальный, только выпускаемого на случайных данных (который, конечно, не является тем, что Вы хотели). Для большего количества информации об этом см. http://www.cocoadev.com/index.pl?NSZombieEnabled.
Всегда используйте -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
Это скажет Вам строку в Вашем коде, где исключение было выдано.
Параметры с орфографической ошибкой должны обычно приводить к "Предупреждению: такой-то и такой-то объект не отвечает на селектор x" в желтом в рассматриваемой строке. Я полагаю, что это идет по умолчанию, поскольку я не должен был изменять параметры компилятора для наблюдения их.
Кроме того, когда я встречаюсь с неперехваченным исключением, иногда выгодно заскочить в gdb консоль (должен подойти, когда Вы выполняете свое приложение), и введите следующее для получения следов для всех потоков:
t купленное
То, что Вы сделали, не является ошибкой времени компиляции, потому что проверки на этапе выполнения Objective C во времени выполнения, если объект может ответить на сообщение, Вы отправляете к нему.
Я рекомендую добавить эту установку сборки на Вашу цель или проект:
GCC_TREAT_WARNINGS_AS_ERRORS = YES
Причина это не ошибка компиляции, то, потому что это совершенно допустимо для отправки сообщения, не известного во время компиляции любому объекту (и любой объект может быть настроен для обработки сообщений динамично также). Все вызовы метода являются действительно сообщениями, отправляемыми в объекты.
В целом, если Вы видите какие-либо предупреждения, необходимо обратиться к ним, поскольку в большинстве случаев они могут привести к проблемам (как Вы видели). Вводящий в заблуждение аспект, вот то, что при компиляции файла однажды и он имеет только предупреждения при компиляции других классов, не внося изменения в класс, который имеет предупреждения, предупреждение не покажет в сообщениях компилятора. Таким образом, время от времени можно хотеть "убрать все цели" и сборку снова, чтобы удостовериться, что Вы не пропустили предупреждений.