自动释放池

时间:2009-03-17 22:30:30

标签: iphone

我希望有人可以帮我解决iPhone上的内存问题。

我有一个滚动视图,它是导航控制器的一部分。

每当我第一次按下导航控制器并滚动滚动视图(按照我的方式添加图像)时,内存将以巨大的块(例如每个1mb)分配。

如果我旋转显示器几次,内存被释放,一切都很好:滚动视图正常工作,内存返回到它应该的位置(大约1mb,查看仪器中的Net alloc)。 / p>

如何在滚动视图的使用过程中保持内存不变或释放内存,就像设备旋转一样?

以下是调用以加载scrollview页面的代码段:

- (void)loadPage:(int)page isCurrent:(BOOL)isCurrent {
if (page < 0) return;
if (page >= totalRows) return;
picViewController *controller = [[picViewController alloc] init];
if ((NSNull *)[viewControllers objectAtIndex:page] == [NSNull null]) {
        NSString *fullPath = [self fullPath];
    if([fileManager fileExistsAtPath:fullPath]) {
        currentImage=[UIImage imageWithContentsOfFile:fullPath];
        [controller setImg:currentImage];
        [viewControllers replaceObjectAtIndex:page withObject:controller];
    }
    else {
            AsyncImageView* asyncImage = [[AsyncImageView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
            asyncImage.tag = 8;
            [asyncImage loadImageFromName:imageName withURL:url];
            [controller.view addSubview:asyncImage];
            [asyncImage release];
            [viewControllers replaceObjectAtIndex:page withObject:controller];
        }
        if (nil == controller.view.superview) {
            CGRect frame = scrollView.frame;
            frame.origin.x = frame.size.width * page;
            frame.origin.y = 0;
            controller.view.frame = frame;
            [scrollView addSubview:controller.view];
        }
    [controller release];
    }

}

3 个答案:

答案 0 :(得分:0)

您的控制器是否注意内存不足通知?您可以清除收到的任何不可见的图像,或者发布您认为相关的任何其他图像。

答案 1 :(得分:0)

我没有看到您的代码中实际上是在清除屏幕外页面。

您的代码有点像Apple的PageControl示例,对吗?

我所做的是每次页面被“激活”时遍历页面并清除超过1或2个屏幕的页面。 (1表示没有反弹滚动,2表示没有反弹。)

- (void)updateCachedPages {
    int active = pageControl.currentPage;
    int count = pageControl.numberOfPages;
    for ( int i = 0; i < count; i++ ) {
        if ( abs( active - i ) <= 2 ) {
            [self loadPage:i];
        }
        else {
            [self purgePage:i];
        }
    }
}

- (void)purgePage:(int)page {
    if ((page < 0) || (page >= [_myObjects count])) return;

    MyControllerClass *controller = [_viewControllers objectAtIndex:page];
    if ((NSNull *)controller != [NSNull null]) {
        [_viewControllers replaceObjectAtIndex:page withObject:[NSNull null]];
        //NSLog( @"Purged page %d", page );
    }
}

致电updateCachedPages中的scrollViewDidEndDecelerating,您的PageControl页面更改操作以及viewWillAppear

答案 2 :(得分:0)

好吧,毕竟我没有释放所有的记忆。

一旦我发现一个类实例没有被正确释放,并确保tewha的清除代码正常工作,一切都很好。

感谢您的快速帮助。这个论坛很棒BTW。