2010-02-19 1 views
5

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

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

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

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

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

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

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

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

ответ

9

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


В уровне сборки, вызова метода 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 и значения стека могут переопределяться. Другими словами, компилятор/время выполнения просто игнорирует дополнительные параметры.

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

+0

Отлично, спасибо за объяснение. – Jasarien