UIWebView使用autoresizingMask在旋转时给出内存警告

时间:2012-10-23 12:43:20

标签: objective-c ipad uiwebview autoresizingmask

我正在开发一个iPad应用程序,我有一个UIView的自定义子类,其中包含显示HTML格式文本的UIWebView(我将其命名为EssayView)。我在UIView的每个页面上都有这些UIScrollView子类的一个实例。用户将其向侧面滚动以在不同文本之间进行选择,然后向下滚动以阅读文本。 scrollview有十个EssayViews

我的应用程序应该支持所有方向,但是当用户旋转设备(横向显示为纵向,反之亦然)时,会抛出内存警告,并且应用程序通常会崩溃。

我做了一些分析。在运行iOS 5的iPad 3上,该应用程序在显示EssayScrollView时消耗528MB的虚拟内存,但在运行iOS 5的iPad 1上,它仅消耗193MB ......它仍然在两者上崩溃。在运行iOS 6的iPad 3上,该应用程序在显示EssayScrollView时会消耗640MB的虚拟内存,但在轮换时不会崩溃。所以问题似乎是运行iOS 5的设备......

以下是我初始化EssayView实例的方法:

EssayView.m

@interface EssayView()
@property UIWebView *essayWebView;
@property NSString *essayName;
@property int essayNumber;
@end

@implementation EssayView

- (id)initWithEssayNamed:(NSString *)theEssayName number:(int)theEssayNumber{
    self = [super initWithFrame:CGRectMake(0,0,[[UIScreen mainScreen] bounds].size.width, [[UIScreen mainScreen] bounds].size.height)];
    if(self){
        essayNumber = theEssayNumber;
        essayName = theEssayName;

        essayWebView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height)];
        essayWebView.center = CGPointMake(self.bounds.size.width/2, essayWebView.center.y);
        [essayWebView setScalesPageToFit:NO];
        essayWebView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
        essayWebView.delegate = self;
    }
    return self;
}

这是我在EssayViews父视图中的轮换代码:

EssayScrollView.m

- (BOOL)shouldAutorotate{
    return YES;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{
    return YES;
}

-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{
    [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
    [scrollView setContentSize:CGSizeMake([essayArray count] * scrollView.frame.size.width, scrollView.frame.size.height)];
    [scrollView setContentOffset:CGPointMake(scrollView.bounds.size.width*currentEssay, 0) animated:NO];
}

我将一组UIViewAutoresizingMasks分配给UIWebViewEssayView的行似乎导致了问题。如果我将其评论出来,则UI可以很好地平滑旋转(但当然UIWebView不会自动调整大小)。

在iOS 5上进行测试时,它会抛出一个内存警告,几秒钟后会旋转并经常崩溃。在iOS 6上,它不会崩溃。在两个操作系统上,旋转动画都比平常慢,而且很笨拙。

有没有办法让我的多个网页视图调整大小而不会导致内存警告和崩溃?

1 个答案:

答案 0 :(得分:2)

那些记忆数太高了。您基本上同时打开10个浏览器选项卡并且最前面,并期望操作系统在轮换时重新渲染它们。您需要考虑重新使用Web视图,而不是一次存在10个。

用户一次只能查看一篇文章,因此不需要同时加载所有文章。您可以缓存滚动位置或其他状态,并在加载视图时重新应用它。