2011-12-26 110 views
3

委托是我的视图控制器。委托中未调用CAAnimation委托方法

我经由设置委托:

CABasicAnimation theAnimation; 
theAnimation.delegate = self; 

然后我配置动画和动画添加到层中,并且我验证它在设备上正确地制作动画。

但是,我不能让被称为该委托方法:

-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag { 
    NSLog(@"animationDidStop called."); 
} 

任何想法?

此外,我无法找到我的视图控制器为CAAnimation委托方法采用的任何协议。我认为所有的委托对象都必须采用协议?

谢谢!

+0

对不起,我不是Objective-C和iOS专家,但会将控制器与协议保持一致? – EricSonaron 2011-12-26 20:28:04

+0

__请注意'CAAnimation'的'委托'功能强大,因此您可能需要将其设置为'nil'来避免保留周期!__ – 2016-08-10 12:37:51

回答

2

此外,我无法找到我的视图控制器采用CAAnimation委托方法的任何协议。我认为所有的委托对象都必须采用协议?

代表团和正式协议是正交的概念:
正式协议是一个非常最近除了Objective-C的编程语言 - 因为事实上,他们之后 CoreAnimation(姓LayerKit)引入

在引入@protocol之前做事的方式 - 以及QuartzCore仍然有效的方式 - 在NSObject上声明了一个所谓的“非正式协议”类别。它只是在最近,苹果开始正式这些 - 看NSURLConnection这样的一个例子,它获得了它的委托协议,与iOS/OS X.

的当前版本此经过短暂抛开历史,现在您的问题:

如果你所展示的是你的代码的逐字拷贝,那么这是行不通的。事实上,如果你不使用ARC,你很幸运,上面的代码不会因EXC_BAD_ACCESS而崩溃。在尝试向其发送消息之前,您应该完全将animation的值设置为有意义的值...

+0

感谢您的出色协议历史。我现在知道,我使用的是一种非正式的协议,您必须在头文件中声明委托方法才能调用它们。上面没有显示我的完整代码,因为我能够让动画在设备上正常工作,正如我向问题的顶部所述。 – 2011-12-29 16:46:34

+0

问题中的代码片段不会崩溃,因为向nil发送消息是有效的并且不起作用。 – 2014-11-21 17:59:08

+1

@AnthonyMattox是的,消息'nil'很好。不,没有ARC,那个变量可能不是'nil':在_manual_引用计数下,对象变量与原始变量的处理方式不同,所以如果你声明了它们而不是给它们赋值,那么你就会有随机垃圾。然而,ARC保证用'nil'初始化本地对象变量。 – danyowdee 2015-03-04 23:57:35