0

我有一個UIImageView的子類,它定期刷新自己以適應不同的圖像。我用下面的代碼沒有任何問題:[UIViewAnimationState animationDidStop:finished:]:發送到釋放實例的消息

UIImage *cachedImage = [[SDImageCache sharedImageCache] imageFromKey:blobKey]; 
if(cachedImage==nil) { 
    NSData *imageData=[NSData dataWithContentsOfURL:url]; 
    cachedImage = [UIImage imageWithData:imageData]; 
    [[SDImageCache sharedImageCache] storeImage:cachedImage imageData:imageData forKey:blobKey toDisk:YES]; 
} 
self.image=cachedImage; 
CATransition *transition = [CATransition animation]; 
transition.duration = 2.0f; 
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
transition.type = kCATransitionFade;  
[self.layer addAnimation:transition forKey:nil]; 

問題是,當我決定使用,而不是上面的代碼,「塊」風格的動畫作爲蘋果提出針對iOS 4.0+:

[UIView transitionWithView:self duration:2.0 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{ 
    self.image=cachedImage; 
} completion:^(BOOL finished) { 
    // do something.. 
}]; 

我應用了新代碼後,收到錯誤消息:「發送到釋放實例的消息」。 (我已經啓用了iOS 5.1 SDK和ARC。)我應該學習塊編程的任何方面嗎?

回答

0

在塊執行之前,您的cachedImage可能會被釋放。在你的第一個例子中,你正在設置self.image(它將保留圖像),然後執行動畫。嘗試創建一個額外的UIImage持有者屬性,該屬性僅保留對cachedImage的引用,以便它在執行該塊時保持不變。

+0

我試圖添加一個額外的持有人屬性,正如你所建議的,通過在塊執行前調用'self.retainedImage = cachedImage'。但是我仍然得到這樣的消息: - [UIViewAnimationState retain]:發送到釋放實例的消息。 (我添加了更多關於如何在原始文章中創建cachedImage的代碼。) – 2012-03-20 02:25:24

1

在我的情況下,使圖像屬性爲零後,動畫塊工作正常。

相關問題