2013-12-12 58 views
0

爲了避免模態行爲,我允許用戶中斷正在運行的CABasicAnimation,並且在此應用程序的上下文中,用戶的操作需要一個新的狀態,其中現有的CALayers應該不再存在。我沒有使用ARC(也許這是我的問題,但承受這個老派問題)。CAAnimation在發佈的CALayer上運行回調-Mac OS X

當用戶採取行動,爲一組的活躍CALayers我這樣做:

for(CALayer *c in layerArray){ 
    [c removeAllAnimations]; 
    [c removeFromSuperlayer]; 
    [c release]; 
} 
[layerArray removeAllObjects]; 

(相信我,是好還是壞,這不是一個過度釋放CALayers的)。然而,從該例程返回並將控制權交還給系統後,系統會調用內部OS例程run_animation_callbacks並崩潰,因爲它試圖將消息發送給殭屍 - 已被刪除併發布的CALayers之一。爲什麼[c removeAllAnimations]不足以告訴操作系統停止在該對象上運行回調?

謝謝。

回答

0

找出答案,留下答案以防萬一對別人有幫助。

當刪除一個CAAnimation(在上面的代碼中調用removeAllAnimations)時,它調用代理的animationDidStop:finished:方法告訴代理動畫已被中斷。 (有趣的是,即使您在刪除動畫時將CALayer's委託設置爲零,也是如此。因此你不能removeAllAnimations並同時釋放對象。相反,我想animationDidStop:finished:方法將不得不有一些方法來檢測它是否應該正常處理。