请耐心等待我,因为我是obj-c的新手,但我有一个UIScrollView和一个分段按钮,可在滚动视图中显示的两个图像之间切换。每个图像都很大,大约500Kb,但它们每个都会造成20多MB的分配并导致我的应用程序崩溃。
- (void)viewDidLoad {
[bvpiscrollview setContentSize:CGSizeMake(768, 2484)];
UIImage *loadBvImage = [UIImage imageNamed:@"bpi_1536x4965v2.png"];
bvpiimg.image = loadBvImage;
[loadBvImage release];
[super viewDidLoad];
}
-(UIView *)viewForZoomingInScrollView:bvpiscrollview{
return bvpiimg;
}
-(IBAction)pidonebutton{
[self.view removeFromSuperview];
}
-(IBAction)segmentedControlIndexChanged{
switch (self.segmentedControl.selectedSegmentIndex)
{
case 0:
[bvpiscrollview setContentSize:CGSizeMake(768, 2484)];
UIImage *loadBvImage = [UIImage imageNamed:@"bpi_1536x4965v2.png"];
bvpiimg.image = loadBvImage;
[loadBvImage release];
break;
case 1:
[bvpiscrollview setContentSize:CGSizeMake(768, 2556)];
UIImage *loadMpImage = [UIImage imageNamed:@"mpi_1536x5110v2.png"];
bvpiimg.image = loadMpImage;
[loadMpImage release];
default:
break;
}
}
- (void)dealloc {
[bvpiimg release];
[bvpiscrollview release];
[segmentedControl release];
[super dealloc];
}
@end
答案 0 :(得分:4)
500k RGBA图像约为350像素。 1536 x 5110像素的RGBA图像大约为31.4 MB。您似乎将图像大小与文件大小混淆。
所有iOS设备支持的最大尺寸是一侧1024像素,但有些支持更大的尺寸。尝试将大图像切割为较小的图块,然后将其添加到视图层次结构中的视图中。您可以通过对CGImageCreateWithImageInRect
的一系列调用在运行时剪切图像。我通常选择512像素或更小的瓷砖。
答案 1 :(得分:1)
您从here获取的一些背景信息:
在速度方面,人们普遍误解了发生的事情。 + imageNamed做的最大的事情就是解码源文件中的图像数据,这几乎总是会显着增加数据大小(例如,屏幕大小的PNG文件在压缩时可能会消耗几十KB,但是消耗的半个MB以上解压缩 - 宽度*高度* 4)。相比之下+ imageWithContentsOfFile:每次需要图像数据时都会解压缩该图像。你可以想象,如果你只需要一次图像数据,那么你在这里什么也没有赢,除了有一个图像的缓存版本,并且可能比你需要的时间更长。但是,如果你有一个需要经常重绘的大图像,那么有其他选择,虽然我建议主要是避免重绘那个大图像:)。
我猜测图片何时被加载,特别是考虑到上面代码片段中的非常大的尺寸,它会占用相当多的内存。
您可以尝试关闭像done here这样的图像优化,或尝试使用PNG以外的其他图像格式。
答案 2 :(得分:0)
请勿使用[UIImage imageNamed:]加载此类大图像。查找包的路径并使用[UIImage imageWithPath]从中加载它们。