设置animationDidStopSelector:在UIView的动画委托上

时间:2010-02-19 16:14:00

标签: iphone animation uiview delegates

我认为我在过去一年半的iPhone开发经历中做错了...我可以使用一些知识渊博的澄清!

您可能或可能不知道,使用beginAnimations:forContext:方法可以非常轻松地动画UIView属性,并使用commitAnimations调用将其打包。

您还可以设置动画委托,以便在动画的某些部分出现时执行操作,例如开始,结束等。

我已经在我的代码中使用了UIView动画很长一段时间并且从来没有遇到过任何严重的问题,但我刚刚遇到了一些我一定错过的文档。

UIView setAnimationDidStopSelector:的文档指出,传入此方法的任何选择器都应采用以下形式:

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

我根本没有这样做过。我一直在设置不带参数的普通旧doThisdoThat类型选择器。

我一直在接受什么?我应该重写我的所有代码以使用记录的表单吗?或者,如果我需要知道动画是否在停止之前完成或需要将某些特定于上下文的数据传递给方法,那么这个形式是为了方便吗?

1 个答案:

答案 0 :(得分: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和堆栈值可以自由覆盖。换句话说,编译器/运行时将忽略额外的参数

只有在你占用太多参数时才会出现问题。