GIF图像动画的内存问题 - ios

时间:2016-10-25 14:13:33

标签: ios objective-c

我使用以下代码显示启动画面:

UIImageView *defaultImage = [[UIImageView alloc] init];
defaultImage.frame = defaultImageFrame;

// for iOS 9 Compatability

//NSMutableArray *buttonsArray = [[NSMutableArray alloc] initWithCapacity:1];

NSMutableArray *buttonsArray = [NSMutableArray arrayWithCapacity:1];


for (int i = 1; i<=3; i++)
{
    [buttonsArray addObject:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"img00%d", i] ofType:@"png"]]];
}


mAnimatedButtons = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, WIDTH_DEVICE, HEIGHT_DEVICE)];
[mAnimatedButtons setUserInteractionEnabled:NO];
[mAnimatedButtons setAnimationImages:buttonsArray];
[mAnimatedButtons setAnimationRepeatCount:0];
[mAnimatedButtons setAnimationDuration:2.0];
[mAnimatedButtons startAnimating];


[defaultImage addSubview:mAnimatedButtons];
[self.view addSubview:defaultImage];

我将删除此后的启动画面

 [mAnimatedButtons stopAnimating];    //here animation stops
[mAnimatedButtons removeFromSuperview];    // here view removes from view hierarchy
mAnimatedButtons = nil;

self.defaultImage=nil;

[self.defaultImage removeFromSuperview];
[self.view.layer removeAllAnimations];

for (CALayer* layer in [self.view.layer sublayers])
{
    [layer removeAllAnimations];
}

添加此代码会将内存使用量增加到300 Mb。 删除它只有100 Mb。

我也试过以下代码

self.defaultImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, WIDTH_DEVICE, HEIGHT_DEVICE)];
 self.defaultImage.animationImages = [NSArray arrayWithObjects:
                                     [UIImage imageNamed:@"img001.png"],
                                     [UIImage imageNamed:@"img002.png"],
                                     [UIImage imageNamed:@"img003.png"],
                                      nil];
 //self.defaultImage.animationDuration = 1.0f;
 self.defaultImage.animationRepeatCount = 0;
[self.defaultImage setAnimationDuration:2.0];
[ self.defaultImage startAnimating];
[self.view addSubview:  self.defaultImage];

即使结果相同。

1 个答案:

答案 0 :(得分:0)

图像在应用程序中使用时,可能需要比持久存储中的资产大小更多的内存。资产经常被压缩(例如JPG或PNG),但是当您使用图像时,它们会被解压缩,通常每个像素需要4个字节(分别为红色,绿色,蓝色和alpha字节)。因此,例如,当您使用图像时,iPhone 7+全屏视网膜图像可能需要14mb。因此,内存有效的技术是使用延迟加载,而不是创建UIImage对象,直到你绝对需要它们。并且,正如Jerry建议的那样,因为内存量取决于图像的大小,而不是图像视图,如果你的图像的尺寸大于你使用它们的UIImageView所要求的尺寸(即宽度和imageview的高度乘以设备的&#34;比例&#34;,您可能需要相应地调整图像大小。