在本地加载60张图像是否可能......?

时间:2011-01-08 12:06:50

标签: iphone

当我的应用程序启动时,它在UIImageView中一次加载60个图像 它还会加载背景音乐。

在模拟器中它工作正常,但在IPAD中崩溃..

-(void)viewDidLoad
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

//img.animationImages = [[NSArray arrayWithObjects:

MyImages = [NSArray arrayWithObjects:
                       //[UIImage imageNamed: @"BookOpeningB001.jpg"],...... B099,nil];


//[NSTimer scheduledTimerWithTimeInterval: 8.0 target:self selector:@selector(onTimer) userInfo:nil repeats:NO];

img.animationImages = MyImages;
img.animationDuration = 8.0; // seconds
img.animationRepeatCount = 1; // 0 = loops forever
[img startAnimating];
[self.view addSubview:img];
[img release]; 

[pool release];

//[img performSelector:@selector(displayImage:) ];

//[self performSelector:@selector(displayImage:) withObject:nil afterDelay:10.0];
[self performSelector: @selector(displayImage) withObject: nil afterDelay: 8.0];
}


-(void)displayImage {

SelectOption *NextView = [[SelectOption alloc] initWithNibName:nil bundle:nil];

[self presentModalViewController:NextView animated:NO];
[NextView release];
}

我做错了吗? 还有其他替代方法可以更快地加载本地图像 UIImageView!

2 个答案:

答案 0 :(得分:3)

我做了类似的事情。即使您退出iPad上的所有其他应用程序并设法让它运行,它也会随机崩溃。

我通过预加载非常小(如5或6 k)gif图像来修复此问题。然后,当我的用户进入需要看到大图像的区域时,我将完整的res图片作为jpg加载,并在完成后立即释放该对象。

现在我的应用程序在模拟器或设备上不再出现问题,我不必让用户关闭所有内容。

答案 1 :(得分:1)

如果设备崩溃但模拟器上没有崩溃9/10次,您的应用程序会收到一些内存警告并被迫退出。

这个理论可以通过两种方式轻松测试。首先是在appDelegates内存警告事件方法中将某些内容记录到控制台,其次,当您在模拟器中运行应用程序时,打开活动监视器并按名称查看应用程序的内存使用情况。

黄金法则是你应该使用你可以逃脱的图像的低分辨率。

Rohit说,预先加载较小的图像是解决此问题的一种方法,前提是您没有泄漏,但此解决方案仅适用于某些应用。

懒惰地加载媒体通常是你应该如何做到这一点。如果你实现了一个像样的内存效率设计,你没有理由在iPad应用程序中同时加载任何超过3个完整res(全屏)图像。

如果你正在做类似幻灯片放映的事情,你应该只是将聚焦的图像+每张1个图像加载到内存中,在你去的时候摧毁范围图像。使用UIScrollView可以轻松完成滚动开始,发生和结束时触发的事件。

使用CATitledLaye r可以提高速度,可以对任何图像任务进行多线程处理(GCD和块)(让UIKit上下文现在也是线程安全的。)

祝你好运,通过苹果文档或快速搜索可以访问所有这些内容的大量例子。