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]; 

문제는, "블록은"애플과 같은 스타일의 애니메이션은 4.0 이상 iOS 용 제안 : 나는 어떤 문제없이 아래의 코드를 사용

[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 (이미지를 유지함)를 설정하고 있습니다. 블록이 실행될 때마다 cachedImage에 대한 참조가 유지되도록 UIImage 홀더 속성을 추가로 만들어보십시오.

+0

블록 실행 전에'self.retainedImage = cachedImage'를 호출하여 제안한 것처럼 여분의 holder 속성을 추가하려고했습니다. 하지만 여전히 메시지가 나타납니다 : - [UIViewAnimationState retain] : 메시지가 할당 취소 된 인스턴스로 전송되었습니다. (원래 게시물에 cachedImage를 만든 방법에 대한 코드를 추가했습니다.) –

1

애니메이션 블록이 잘 작동 한 후에 이미지 속성을 nil로 만듭니다.