gpt4 book ai didi

iphone - 设置animationDidStopSelector : on UIView's animation delegate

转载 作者:行者123 更新时间:2023-12-03 18:54:24 24 4
gpt4 key购买 nike

我认为在过去一年半的 iPhone 开发经验中我一直在做这个错误的事情...我需要一些知识渊博的澄清!

您可能知道也可能不知道,使用 beginAnimations:forContext: 方法可以非常轻松地为 UIView 属性设置动画,并通过 commitAnimations 调用将其包装起来。

您还可以设置动画委托(delegate)以在动画的某些部分发生时执行操作,例如开始、结束等。

我在代码中使用 UIView 动画很长时间了,从未遇到过任何严重问题,但我刚刚遇到了我一定错过的文档部分。

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

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

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

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

最佳答案

可以接受。

<小时/>

在汇编级别,调用 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 和堆栈值可以自由覆盖。换句话说,编译器/运行时将简单地忽略额外的参数

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

关于iphone - 设置animationDidStopSelector : on UIView's animation delegate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2297752/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com