首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iPad内存限制

iPad内存限制
EN

Stack Overflow用户
提问于 2012-02-07 15:07:04
回答 2查看 637关注 0票数 3

我正在开发的应用程序相对简单,但它抛出了内存警告。我正在尝试弄清楚应用程序设计是否需要太多内存,是否应该重新设计和拆分以使用更少的内存,或者应用程序设计还不错,但应用程序本身臃肿,错误地占用了超过所需的内存。

该应用程序从网络上下载一个包含一组问题的XML文件,然后生成一个显示问题控件列表的UIScrollView。每个问题控件都有一个UITextView和一个UISegmentedControl、UIButton、UITableView、UITextField或四个UITextFields和一个UIButton (自定义日期控件). ,下面是一个屏幕截图:

此设置适用于较小的问题集,但应用程序开始在较大的超过120个问题集中抛出内存警告。以下是在较大的问题集中运行分配和VM Tracker Instruments的典型运行:

分配内存在xml下载和模型加载时达到峰值,但警告直到分配内存达到平稳后才会抛出。虽然VM跟踪器内存在抛出时仍在增加,这让我认为控件仍在加载到内存中,VM跟踪器是导致警告的内存增长的更好指示器。*警告通常在驻留大小超过125MB时发生。*我找到了一种方法来显著降低驻留大小。*问题控件有一个自定义视图,为它们提供圆角边缘和阴影。*如果我从自定义视图注释掉drawRect代码(如下所示),则分配内存保持不变,但驻留大小下降约30 MB,并且不会增长到超过93 MB。*我可以找到较轻的重量问题的背景,但我更喜欢保持圆角的边缘和阴影,如果我可以减少它的内存占用。

代码语言:javascript
复制
- (void)drawRect:(CGRect)rect {
    // get the contect
    CGContextRef context = UIGraphicsGetCurrentContext();

    //for the shadow, save the state then draw the shadow
    CGContextSaveGState(context);
    CGContextSetShadow(context, CGSizeMake(4,-5), 10);

    //now draw the rounded rectangle
    CGContextSetStrokeColorWithColor(context, [[UIColor blackColor] CGColor]);  

    if(_HighlightColor==nil){
        _HighlightColor = [[UIColor whiteColor] retain];
    }
    CGContextSetFillColorWithColor(context, _HighlightColor.CGColor);

    //since I need room in my rect for the shadow, make the rounded rectangle a little smaller than frame
    CGRect rrect = CGRectMake(CGRectGetMinX(rect), CGRectGetMinY(rect), CGRectGetWidth(rect)-30, CGRectGetHeight(rect)-30);
    CGFloat radius = 5;
    // the rest is pretty much copied from Apples example
    CGFloat minx = CGRectGetMinX(rrect), midx = CGRectGetMidX(rrect), maxx = CGRectGetMaxX(rrect);
    CGFloat miny = CGRectGetMinY(rrect), midy = CGRectGetMidY(rrect), maxy = CGRectGetMaxY(rrect);

    // Start at 1
    CGContextMoveToPoint(context, minx, midy);
    // Add an arc through 2 to 3
    CGContextAddArcToPoint(context, minx, miny, midx, miny, radius);
    // Add an arc through 4 to 5
    CGContextAddArcToPoint(context, maxx, miny, maxx, midy, radius);
    // Add an arc through 6 to 7
    CGContextAddArcToPoint(context, maxx, maxy, midx, maxy, radius);
    // Add an arc through 8 to 9
    CGContextAddArcToPoint(context, minx, maxy, minx, midy, radius);
    // Close the path
    CGContextClosePath(context);
    // Fill & stroke the path
    CGContextDrawPath(context, kCGPathFillStroke);

    //for the shadow
    CGContextRestoreGState(context);
}

仪器和内存警告使它看起来像是内存已满,但对我来说,这些数字似乎很高。我认为滚动视图中的120个问题控件对iPad来说不是问题,但我没有关于它们应该占用多少内存的参照系。考虑到iPad可以运行的一些图形密集型游戏,上面的简单drawRect代码似乎不会占用超过30 MB的问题控件。这个内存使用率看起来很高,或者这是你期望从一个有这么多简单内存的应用程序中得到的UI元素? drawRect中有什么东西会占用大量内存吗?或者有什么建议可以优化它吗?如果这看起来应该最大限度地耗尽iPad的内存,我将创建选项卡或页面,并限制我在选项卡/页面上输入的问题的数量,以便一次只有一小部分控件被加载到内存中。但是,如果iPad能够在内存中处理它们,我宁愿不拆分它们。任何输入都非常感谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-07 15:30:50

您分配的每个视图都将占用大量内存。当你在屏幕上(或滚动视图中的屏幕外)有很多视图时,避免使用大量内存的方法是拥有一个可重用的视图池,只有几个视图在任何时候都比屏幕上的视图多。

坏消息是:这种缓存和交换设置起来相当复杂。

好消息: UITableView为你做到了!

当你有任意数量的UIViews时,最好的解决方案几乎总是将它们放在一个表视图中,然后让苹果来做这些繁重的工作。

票数 4
EN

Stack Overflow用户

发布于 2012-02-07 15:22:43

您可以使用heap shot analysis (使用工具)监视内存增量,直到分配回溯细节--这应该让您对增长的内容及其原因有足够的了解。这些分配通常指示您在此期间还应该销毁的内容。

此外,请确保您的程序中没有泄漏。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9172275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档