我正在制作一个像电影播放器一样的应用程序,但我没有显示视频,而是将电影放在图像帧中。滑块用于前后移动“电影”,如果松开,“电影”会自动播放到一章。我通过在滑块的每个值更改上设置UIImageView
并更改属性来实现这一点。image
一段时间后,应用程序由于内存警告而崩溃。我不能使用 UIImage 的动画,因为我想通过滑动滑块来控制位置(又名可见图像/帧)。所以我有一个 ImageManager 类,它在初始化时将字符串中的所有图像名称加载到一个数组中(总共 1500 个图像,每个图像大约 150kb)。
- (id) initWithCanvas:(UIImageView*) canvasView{
self = [super init];
if (self) {
totalImages = 1500;
self.canvas = canvasView;
self.images = [[NSMutableArray alloc] init];
for (int i=0; i<totalImages; i++){
[self.images addObject:[NSString stringWithFormat:@"frame_%04d.jpg", i]];
i = i + 4; // I use this to skip 4 frames
}
previewsImageIndex = -1;
[self setImageAtPosition:0];
}
return self;
}
然后我有一个在 UISlider 的值更改时触发的函数,它找到当前图像名称并从图像名称构造一个 UIImage 并将其设置为 UIImageView
- (void) setImageAtPosition:(CGFloat)percentage{
currentImage = nil;
int position = percentage * [self.images count];
if (position != previewsImageIndex){
previewsImageIndex = position;
NSLog(@"Got image:%d at percentage: %f", position, percentage);
if (position < [self.images count]){
self.canvas.image = nil;
currentImage = [UIImage imageNamed:[self.images objectAtIndex:position]];
[self.canvas setImage:currentImage];
currentImage = nil;
//[currentImage release];
}
}
}
即使我将 currentImage 和 canvas.image 设置为 nil,应用程序仍然会在一段时间后崩溃。我不明白我在哪里有内存泄漏。另外,我用 ARC 编码,所以没有发布。
除了拥有 UIImage 视图之外,还有其他更好的方法吗?我想要逐帧查看功能,而 MPMoviePlayer 或 AVPlayer 无法进行细粒度的擦洗。