我已经阅读了很多关于低内存警告崩溃的帖子,但是我无法解决我的应用程序中的崩溃问题。仪器分配显示实时字节范围为2-7MB。它永远不会超过7或7.5MB,但仍然是应用程序崩溃。
我读了一些链接,告诉Allocations和Activity监视器显示不同的内存使用值。如前所述,分配将显示最大7-7.5MB,但活动监视器在启动应用程序时显示约75MB的使用率,并且当我使用该程序时,它开始增加和减少。它将达到110-120MB,然后降低到75-80MB。
更多链接说要查看VM Tracker中的脏大小和驻留大小。当我签入VM Tracker时,Dirty大小将从30MB开始并在我使用应用程序时开始增加。它超过了400MB。我使用大约150张图像,其中大约70-80是1024x1024大小,大约35张是110x110,其余是3000x4000大小的图像。所有这些图像最初都是png格式,我已经以编程方式转换为JPG + ALPHA并作为资产添加到应用程序中。每当必须加载相应的图像时,我将JPG + ALPHA图像分成16个部分,最后将它们连接起来以获得原始图像。我这样做是因为当我试图加载分辨率为3000x4000的图像时,内存在Allocations中一直飙升到40-45MB,因此使用了这种方法。此方法可确保内存永远不会超过10MB。
所有这些记录和统计数据都是使用模拟器测量的。
应用程序永远不会在模拟器上崩溃,但它会在真实设备上崩溃。我正在使用iPad2进行测试。
请帮我解决这个问题。我被困在过去2天,看到应用程序崩溃完全感到沮丧。
答案 0 :(得分:0)
这段代码是否正确?
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”。
- (void)panRecognized:(UIPanGestureRecognizer *)gestureRecognizer
{
if(selectedItem.image && [gestureRecognizer isEnabled])
{
UIImageView *piece = selectedItem;
if ((([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged)) && [((NSString*) [piece observationInfo]) isEqualToString:@"BadgeAccessories"])
{
CGPoint translation = [gestureRecognizer translationInView:[piece superview]];
[piece setCenter:CGPointMake([piece center].x + translation.x, [piece center].y + translation.y)];
[gestureRecognizer setTranslation:CGPointZero inView:[piece superview]];
}
if ([gestureRecognizer state] == UIGestureRecognizerStateEnded ||[gestureRecognizer state] == UIGestureRecognizerStateCancelled || [gestureRecognizer state] == UIGestureRecognizerStateFailed)
{
if(CGRectContainsPoint([[self view]viewWithTag:RECYCLEBIN_TAG].frame, [gestureRecognizer locationInView:imageArea]))
{
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc]init];
[objectsAdded removeObjectForKey:[NSString stringWithFormat:@"%d",selectedItem.tag]];
[pool release];
[UIView beginAnimations:NULL context:nil];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:0.4];
[UIView setAnimationDidStopSelector:@selector(propDeleted:finished:context:)];
[UIView setAnimationDelegate:self];
[selectedItem setFrame:CGRectMake(selectedItem.frame.origin.x, selectedItem.frame.origin.y, 5, 5)];
selectedItem.center = [[[self view]viewWithTag:RECYCLEBIN_TAG]center];
[UIView commitAnimations];
}
else
{
[self applyEffectOnTouch:0];
}
}
}
}
答案 1 :(得分:0)
您尝试加载的图片非常大。也许您应该考虑使用CATiledLayer来显示图像。您可以找到apple类定义here。
还要考虑使图像更易于渲染与减少图片内存使用量之间的区别。如果将图像分割成较小的部分,则会减少单个绘制负载,但如果将每个图像加载到内存中,仍会遇到内存问题。
平铺图层显示非常大的图像,同时通过尝试仅加载可见图块来降低内存使用率。
此外,您的模拟器没有实际设备的内存限制。您应该在实际设备上执行所有压力测试。
编辑:您还应该避免使用UIImage imageNamed,因为它会缓存图像并使您的内存问题更加严重。请改用imageWithContentsOfFile。