iphone/iPad内存使用率极低,应用程序崩溃

iphone/iPad内存使用率极低,应用程序崩溃,iphone,ipad,memory,crash,ios-simulator,Iphone,Ipad,Memory,Crash,Ios Simulator,我读过很多关于低内存警告崩溃的帖子,但我无法在我的应用程序中解决崩溃问题。仪器的分配显示从2-7MB的活动字节。它的峰值从未超过7或7.5MB,但应用程序仍会崩溃 我读了一些链接,这些链接告诉我分配和活动监视器显示了不同的内存使用值。如前所述,分配将显示最大7-7.5MB,但活动监视器在应用程序启动时显示约75MB的使用量,当我使用该程序时,它开始增加和减少。它将增加到110-120MB,然后减少到75-80MB 还有一些链接说要查看VM Tracker中的脏大小和驻留大小。当我签入VM Tra

我读过很多关于低内存警告崩溃的帖子,但我无法在我的应用程序中解决崩溃问题。仪器的分配显示从2-7MB的活动字节。它的峰值从未超过7或7.5MB,但应用程序仍会崩溃

我读了一些链接,这些链接告诉我分配和活动监视器显示了不同的内存使用值。如前所述,分配将显示最大7-7.5MB,但活动监视器在应用程序启动时显示约75MB的使用量,当我使用该程序时,它开始增加和减少。它将增加到110-120MB,然后减少到75-80MB

还有一些链接说要查看VM Tracker中的脏大小和驻留大小。当我签入VM Tracker时,脏大小将从30MB开始,并在我使用应用程序时开始增加。它超过了400MB。我使用了大约150个图像,其中大约70-80个图像大小为1024x1024,大约35个图像大小为110x110,其余的图像大小为3000x4000。所有这些图像最初都是png格式的,我已经通过编程转换成JPG+ALPHA,并作为资产添加到应用程序中。每当需要加载相应的图像时,我就将JPG+ALPHA图像分成16个部分,最后将它们连接起来以获得原始图像。我这样做是因为当我尝试加载分辨率为3000x4000的图像时,内存分配达到了40-45MB,所以使用了这种方法。此方法确保内存永远不会超过10MB

所有这些记录和统计数据都是使用模拟器测量的

应用程序不会在模拟器上崩溃,但会在真实设备上崩溃。我正在使用iPad2进行测试

请帮我解决这个问题。在过去的两天里,我被困在这里,看到应用程序崩溃,我感到非常沮丧

此代码正确吗

    UIImageView* framebadgeOrAccessoryImage = [[UIImageView alloc]initWithFrame:sizeOfFrameOrAccessoriesView];
    [framebadgeOrAccessoryImage setCenter:imageArea.center];
    [framebadgeOrAccessoryImage setContentMode:UIViewContentModeScaleAspectFit];
    [framebadgeOrAccessoryImage setImage:badgeOrAccessoryImage];
    [framebadgeOrAccessoryImage setTag:iObjectTag];
    [framebadgeOrAccessoryImage setObservationInfo:@"BadgeAccessories"];
    [framebadgeOrAccessoryImage setExclusiveTouch:YES];

    iObjectTag++;

    [framebadgeOrAccessoryImage setMultipleTouchEnabled:YES];
    [framebadgeOrAccessoryImage setBackgroundColor:[UIColor clearColor]];
    [framebadgeOrAccessoryImage setUserInteractionEnabled:YES];

    [imageArea addSubview:framebadgeOrAccessoryImage];

selectedItem = framebadgeOrAccessoryImage;

    [framebadgeOrAccessoryImage release];
我在使用我设置的标记的其他方法中使用“framebadgeOrAccessoryImage”。我是否必须像在代码的最后一行那样释放“framebadgeOrAccessoryImage”,或者在释放后将其分配给nil

此处使用“framebadgeOrAccessoryImage”和名称“selectedItem”

这个代码正确吗

    UIImageView* framebadgeOrAccessoryImage = [[UIImageView alloc]initWithFrame:sizeOfFrameOrAccessoriesView];
    [framebadgeOrAccessoryImage setCenter:imageArea.center];
    [framebadgeOrAccessoryImage setContentMode:UIViewContentModeScaleAspectFit];
    [framebadgeOrAccessoryImage setImage:badgeOrAccessoryImage];
    [framebadgeOrAccessoryImage setTag:iObjectTag];
    [framebadgeOrAccessoryImage setObservationInfo:@"BadgeAccessories"];
    [framebadgeOrAccessoryImage setExclusiveTouch:YES];

    iObjectTag++;

    [framebadgeOrAccessoryImage setMultipleTouchEnabled:YES];
    [framebadgeOrAccessoryImage setBackgroundColor:[UIColor clearColor]];
    [framebadgeOrAccessoryImage setUserInteractionEnabled:YES];

    [imageArea addSubview:framebadgeOrAccessoryImage];

selectedItem = framebadgeOrAccessoryImage;

    [framebadgeOrAccessoryImage release];
我在使用我设置的标记的其他方法中使用“framebadgeOrAccessoryImage”。我是否必须像在代码的最后一行那样释放“framebadgeOrAccessoryImage”,或者在释放后将其分配给nil

此处使用“framebadgeOrAccessoryImage”和名称“selectedItem”


您尝试加载的图像非常大。也许你应该考虑使用CATIDELAD层来显示图像。您可以找到apple类定义

还考虑使图像更容易呈现而不是减少图片的内存使用的区别。如果您将图像分割成更小的片段,您将减少单个绘图负载,但如果每个图像都加载到内存中,您仍然会遇到内存问题

平铺层显示非常大的图像,同时通过尝试仅加载可见平铺来降低内存使用率

此外,您的模拟器没有实际设备的内存限制。您应该在实际设备上执行所有压力测试


编辑:您还应该避免使用UIImage imageNamed,因为它会缓存图像,并且会使内存问题更加严重。请改用带有文件内容的图像。

您尝试加载的图像非常大。也许你应该考虑使用CATIDELAD层来显示图像。您可以找到apple类定义

还考虑使图像更容易呈现而不是减少图片的内存使用的区别。如果您将图像分割成更小的片段,您将减少单个绘图负载,但如果每个图像都加载到内存中,您仍然会遇到内存问题

平铺层显示非常大的图像,同时通过尝试仅加载可见平铺来降低内存使用率

此外,您的模拟器没有实际设备的内存限制。您应该在实际设备上执行所有压力测试


编辑:您还应该避免使用UIImage imageNamed,因为它会缓存图像,并且会使内存问题更加严重。改为使用imageWithContentsOfFile。

搜索
堆照片
,这是分配工具的一项功能。您可以跟踪在特定时间间隔分配和释放的内存。另外,仅供参考,一些图像处理方法使用缓存,如
imageNamed
。您也可以尝试使用
NSAutoreleasePool
,因为内存中同时有这么多图像。崩溃日志怎么说…?感谢@Templar的回复。我在任何地方都使用过NSAutoreleasePool,我正在使用initWithContentsOfTheFile加载图像的内容。将尝试使用HeapShot并在此处发布结果。如果由于内存不足警告而导致崩溃,则您肯定不会将某些对象设置为零viewDidUnload@AnkitSrivastava坠机日志上写着“被抛弃”。正如我在一些帖子中读到的,丢弃意味着由于低内存警告而崩溃。我说得对吗?搜索
堆照片
,这是分配工具的一项功能。您可以跟踪在特定时间间隔分配和释放的内存。另外,仅供参考,一些图像处理方法使用缓存,如
imageNamed
。您也可以尝试使用
NSAutoreleasePool
,因为内存中同时有这么多图像。崩溃日志怎么说…?感谢@Templar的回复。我在任何地方都使用过NSAutoreleasePool,我正在使用initWithContentsOfTheFile加载图像的内容。将尝试使用HeapShot并在此处发布结果。如果由于内存不足警告而导致崩溃,则您肯定不会将某些对象设置为零viewDidUnload@AnkitSrivastava坠机日志上写着“被抛弃”。正如我在一些帖子中所读到的,抛弃意味着由于内存不足而崩溃