2010-02-19 4 views
5

Je pense que je me trompe depuis un an et demi de mon expérience de développement de l'iPhone ... Je pourrais utiliser quelques éclaircissements s'il vous plaît! Comme vous le savez peut-être, les propriétés de UIView peuvent être animées assez facilement à l'aide de la méthode beginAnimations:forContext:, et encapsuler un appel commitAnimations.Réglage de l'animationDidStopSelector: sur le délégué d'animation de UIView

Vous pouvez également définir un délégué d'animation pour exécuter des actions lorsque certaines parties de l'animation se produisent, tels que le démarrage, la finition, etc.

Je me sers UIView animations dans mon code depuis longtemps et n'a jamais eu des problèmes sérieux, mais je viens de rencontrer une partie des documents que j'ai dû manquer.

La documentation setAnimationDidStopSelector: stipule que toute sélection de UIView passé dans cette méthode devrait être de la forme:

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

Je n'ai pas fait cela. J'ai mis en place de vieux sélecteurs de type doThis et doThat qui ne prennent aucun paramètre.

Est-ce que ce que j'ai fait est acceptable? Dois-je réécrire tout mon code pour utiliser le formulaire documenté? Ou est-ce simplement pour des raisons de commodité si j'ai besoin de savoir si l'animation a été complétée avant d'être stoppée ou si j'ai besoin de transmettre des données spécifiques au contexte à la méthode?

Répondre

9

C'est acceptable.


Au niveau de l'assemblage, appelant une méthode Objective-C

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

ressemblera (pas code ARM réel):

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 gardera tous les registres , trouvez -method:and:also:asWellAs:, et sautez dessus. Au sein -method:… le compilateur associera les paramètres de retour aux registres, à savoir

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

maintenant ce qui se passe si votre méthode est seulement -doThis ou -doThat? Il n'y aura pas de paramètres, donc les registres r2, r3 et les valeurs de pile sont libres de remplacer. En d'autres termes, le compilateur/runtime ignore simplement les paramètres supplémentaires.

Les problèmes ne surviennent que si vous prenez trop de paramètres.

+0

Excellent, merci pour l'explication. – Jasarien

Questions connexes