1

我有一个带有 16 个按钮的 ViewController。每个按钮加载一个弹出框,显示 50 帧在移动中渲染。

最好的形式是什么?

我知道这imageWithName很糟糕,因为它将所有图像加载到缓存中,因此我这样做:

myAnimatedView.animationImages=[NSArray arrayWithObjects:
                                [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@0000",nombrePieza]ofType:@"png"]],
                                [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@0001",nombrePieza]ofType:@"png"]],
                                [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@0002",nombrePieza]ofType:@"png"]],
    ...
    ...
    ...                         [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@0050",nombrePieza]ofType:@"png"]],nil];

但是当我用不同的帧加载大约 10 倍的弹出框时,我只在我的设备上出现内存泄漏,但在模拟器中没有。

出于这个原因,我想知道哪种方式最好?

带视频?或与CAAnimation

感谢帮助。

4

2 回答 2

0

imageNamed本身不会导致泄漏(尽管之前的一些讨论表明它可能在 iOS 4 之前存在错误)。

但是,imageNamed将缓存您的图像,以便您不会为每个实例加载它们,如果您显示的图像。在您的情况下,如果您加载动画 10 次,我想您会看到每个图像只加载一次。您当前的解决方案将强制每次加载您的图像。

最重要的是,该imageNamed方法将透明地处理图像的 Retina 版本,否则您必须手动执行。

从文档中:

此方法在系统缓存中查找具有指定名称的图像对象,如果存在则返回该对象。如果匹配的图像对象尚未在缓存中,则此方法从指定文件加载图像数据,缓存它,然后返回结果对象。

于 2012-04-09T12:12:33.760 回答
0

在这种情况下,您最好使用计时器,以免出现内存问题

...
page = 1;
imageAnim = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)];
[[self view] addSubview:imageAnim];
tim = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(avv) userInfo:nil repeats:YES]; 
...

- (void)avv {
    UIImage *img = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"SplashAnimation %03d", page] ofType:@"png"]];
    [imageAnim setContentMode:UIViewContentModeScaleToFill];
    [imageAnim setImage:img];
    page++;
    if(page > maxNumberFrame) {
       [tim invalidate];
    }
}

这是一个获得想法的例子

于 2012-04-09T12:04:46.553 回答