2010-02-19 11 views
5

Creo que he estado haciendo esto mal durante el último año y medio de mi experiencia de desarrollo de iPhone ... ¡Podría utilizar alguna clarificación bien informada, por favor!Configuración de animationDidStopSelector: en el delegado de animación de UIView

Como usted puede o no puede saber, las propiedades de UIView se pueden animar con bastante facilidad utilizando el método beginAnimations:forContext:, y lo finalizan con una llamada commitAnimations.

También puede establecer un delegado de animación para realizar acciones cuando se producen ciertas partes de la animación, tales como iniciar, terminar etc.

He estado usando UIView animaciones en mi código desde hace mucho tiempo y nunca tuvo cualquier problema grave, pero acabo de encontrar una sección de los documentos que me he perdido.

La documentación para setAnimationDidStopSelector: estados de UIView que cualquier selector pasa a este método debe ser de la forma:

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

no he estado haciendo eso en absoluto. He estado estableciendo los viejos selectores de tipo doThis y doThat que no toman parámetros.

¿Es lo que he estado haciendo aceptable? ¿Debo volver a escribir todo mi código para usar el formulario documentado? ¿O es esa forma simplemente por conveniencia si necesito saber si la animación se completó o no antes de ser detenida o si necesitaba pasar algunos datos específicos del contexto al método?

Respuesta

9

Es aceptable.


En el nivel de conjunto, una llamada al método de Objective-C

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

se verá como (no código ARM real):

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 

donde objc_msgSend mantendrá todos los registros , encuentre -method:and:also:asWellAs:, y salte a él. Dentro -method:… el compilador asociar los parámetros con los registros, es decir

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

ahora qué sucede si su método sólo es -doThis o -doThat?

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

No habrá por lo que los parámetros R2, R3 y registra los valores de la pila son libres para anular. En otras palabras, el compilador/tiempo de ejecución simplemente ignorará los parámetros adicionales.

Los problemas surgirán solo si toma demasiados parámetros.

+0

Excelente, gracias por la explicación. – Jasarien

Cuestiones relacionadas