2011-11-06 2 views
1

저는 obj-c에서 초보자입니다. 그래서이 논리의 일부를 이해할 수 없습니다. 내 코드와 응용 프로그램 논리를 이해하고 싶습니다. 내 응용 프로그램이있는 UIImageView의 애니메이션을 쉽게 예를 수정입니다 : 이것은이하는 .m이다 .H (STANDART에서 뷰 기반 템플릿)버튼이 ivars를 사용하는 방법으로 EXC_BAD_ACCESS를 가져 오는 버튼

#import <UIKit/UIKit.h> 
@interface ImageAnimatorViewController : UIViewController { 
    UIImageView *animImage; 
} 
@property (nonatomic, retain) IBOutlet UIImageView *animImage; 
- (IBAction)startAnimation; 
- (NSArray*)creatAnimation:(NSString*)fileName; 
@end 

@synthesize animImage; 
- (IBAction)startAnimation{ 
    [animImage startAnimating]; 
}  
- (void)viewDidLoad{ 
    [super viewDidLoad]; 

    animImage.animationImages = [self creatAnimation:@"Images.jpg"]; 
    animImage.animationDuration = 1.0f; 
    animImage.animationRepeatCount = 0; 
}  
- (NSArray*)creatAnimation:(NSString*)fileName{ 
    UIImage *image = [UIImage imageNamed:fileName]; 
    NSMutableArray *animationImages = [NSMutableArray array]; 
    for (int i = 0; i<8; i++) { 
     CGImageRef imageRef = CGImageCreateWithImageInRect(image.CGImage, 
     CGRectMake(i*600.0f, 0.0f, 600.0f, 262.0f)); 
     UIImage *animationImage = [UIImage imageWithCGImage:imageRef]; 
    [animationImages addObject:animationImage]; 
    [animationImage release]; 
    } 
    return animationImages; 
} 

는 또한 i '를 (의 standart 할당 해제 및 viewDidUnload 제외) 이미지 뷰 및 버튼이있는 xib을 사용하지만 b를 누르면 콘솔에 EXC_BAD_ACCESS가 충돌합니다. IBAction에서는 imageView가 animationImages를 가지고 있지 않다는 것을 알았지 만 왜 그럴까요? viewDidLoad에는 2 (그리고 왜 2?)가 있기 때문에 이상한 참조 카운트 = 3을가집니다. 나는 viewDidLoad에 self와 self-> 접두사를 추가하지만 아무런 결과가 없습니다. animationImages는 (복사본) 속성이므로 자동 렌더링 풀이 animationImages로 소모 된 후에 이미지가 저장됩니다. 나는 app.10x의 이러한 동작에 대해 매우 놀랐습니다!

답변

0

animationimagecreateAnimation 방법으로 해제하지 마십시오. CGImageRef을 사용하여 메모리를 정리해야합니다. CGImageRelease

+0

고맙습니다. 그러나 당신은 당신의 대답을 설명 할 수 있습니까? 나는 animationImage에 필요한 참조 횟수가 더 많기 때문에 메모리 누수가있다. 내게 무엇이 숨겨져 있습니까?) – stworks

+0

짧게. ** alloc **, ** new **, ** retain **, ** copy **를 사용하여 객체를 생성하면 객체를 릴리스해야합니다. animationImage를 만들 때 아무것도 사용하지 않으므로 animationImage를 릴리스 할 필요가 없습니다. 기본 메모리 관리 규칙을 읽도록 조언 할 수 있습니다. 추신. 내 대답이 옳고 유용 할 경우 왼쪽의 초록색 틱을 클릭하여 수락하십시오. – beryllium