Установка animationDidStopSelector: для делегата анимации UIView - PullRequest
5 голосов
/ 19 февраля 2010

Я думаю, что я делал это неправильно в течение последних полутора лет моего опыта разработки iPhone ... Я мог бы использовать некоторые знающие разъяснения, пожалуйста!

Как вы можете знать, а может и не знать, свойства UIView можно легко анимировать с помощью метода beginAnimations:forContext:, а затем обернуть его вызовом commitAnimations.

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

Я давно использую анимацию UIView в своем коде, и у меня никогда не было серьезных проблем, но я только что натолкнулся на раздел документов, который я, должно быть, пропустил.

Документация для setAnimationDidStopSelector: UIView гласит, что любой селектор, передаваемый в этот метод, должен иметь вид:

- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context;

Я вообще этого не делал. Я устанавливал простые старые селекторы типа doThis и doThat, которые не принимают параметров.

Допустимо ли то, что я делаю? Должен ли я переписать весь свой код для использования документированной формы? Или эта форма просто для удобства, если мне нужно знать, завершена ли анимация перед тем, как она остановлена, или необходимо передать некоторые специфические для контекста данные в метод?

1 Ответ

9 голосов
/ 19 февраля 2010

Это приемлемо.


На уровне сборки вызов метода Objective-C

id something = [obj method:arg0 and:arg1 also:arg2 asWellAs:arg3];

будет выглядеть ( не фактический код ARM):

load  r0      <- obj
load  r1      <- @selector(method:and:also:asWellAs:)
load  r2      <- arg0
load  r3      <- arg1
load  [sp, 0] <- arg2
load  [sp, 4] <- arg3
call          objc_msgSend
store r0      -> something

, где objc_msgSend сохранит все регистры, найдет -method:and:also:asWellAs: и прыгнет к нему.В -method:… компилятор свяжет параметры обратно с регистрами, то есть

store r0        -> self
store r1        -> _cmd
store r2        -> param0
store r3        -> param1
store [sp, ?]   -> param2
store [sp, ?+4] -> param3
// rest of execution

Что теперь произойдет, если ваш метод только -doThis или -doThat?

store r0        -> self
store r1        -> _cmd
// rest of execution

Параметров не будет, поэтому регистры r2, r3 и значения стека можно переопределять.Другими словами, компилятор / среда выполнения просто игнорирует дополнительные параметры .

Проблемы возникнут только в том случае, если вы примете слишком много параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...