2011-12-26 113 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