ipad scrollview导致malloc为40x图像的大小

时间:2010-07-22 20:18:18

标签: iphone ipad uiscrollview uiimage malloc

请耐心等待我,因为我是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

3 个答案:

答案 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]从中加载它们。