저는 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의 이러한 동작에 대해 매우 놀랐습니다!
고맙습니다. 그러나 당신은 당신의 대답을 설명 할 수 있습니까? 나는 animationImage에 필요한 참조 횟수가 더 많기 때문에 메모리 누수가있다. 내게 무엇이 숨겨져 있습니까?) – stworks
짧게. ** alloc **, ** new **, ** retain **, ** copy **를 사용하여 객체를 생성하면 객체를 릴리스해야합니다. animationImage를 만들 때 아무것도 사용하지 않으므로 animationImage를 릴리스 할 필요가 없습니다. 기본 메모리 관리 규칙을 읽도록 조언 할 수 있습니다. 추신. 내 대답이 옳고 유용 할 경우 왼쪽의 초록색 틱을 클릭하여 수락하십시오. – beryllium