我有一个UIImageView的子类,它定期刷新自己到不同的图像。我使用下面的代码没有任何问题:
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 :(得分:1)
在我的情况下,在动画块工作正常后使图像属性为nil。
答案 1 :(得分:0)
可能在块执行之前释放了cachedImage。在第一个示例中,您将在执行动画之前设置self.image(将保留图像)。尝试创建一个额外的UIImage holder属性,该属性只保留对cachedImage的引用,以便在块执行时保持不变。