我认为在过去一年半的 iPhone 开发经验中我一直在做这个错误......我需要一些知识渊博的澄清!
您可能知道也可能不知道,使用 UIView 属性可以很容易地设置动画beginAnimations:forContext:
方法,并用一个包装它commitAnimations
call.
您还可以设置动画委托以在动画的某些部分发生时执行操作,例如开始、结束等。
我在代码中使用 UIView 动画已经很长时间了,从来没有遇到过任何严重的问题,但我刚刚遇到了我一定错过的文档的一部分。
UIView 的文档setAnimationDidStopSelector:
声明传递到此方法的任何选择器都应采用以下形式:
- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context;
我根本没有这样做过。我一直设置普通旧doThis
and doThat
不带参数的类型选择器。
我所做的事情可以接受吗?我应该重写所有代码以使用记录的形式吗?或者,如果我需要知道动画在停止之前是否完成或需要将一些上下文特定数据传递给方法,那么该形式只是为了方便?
这是可以接受的。
在汇编级别,调用 Objective-C 方法
id something = [obj method:arg0 and:arg1 also:arg2 asWellAs:arg3];
看起来像(not实际的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
where 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
or -doThat
?
store r0 -> self
store r1 -> _cmd
// rest of execution
不会有参数,因此寄存器 r2、r3 和堆栈值可以自由覆盖。换句话说,编译器/运行时将简单地忽略额外的参数.
只有当你使用太多参数时才会出现问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)