Iphone 自动释放池

Iphone 自动释放池,iphone,Iphone,我希望有人能帮我解决iPhone上的内存问题 我有一个滚动视图,它是导航控制器的一部分 每当我第一次按下导航控制器并在scrollview中滚动时(边走边添加图像),内存都会被分配成大块(比如说每个1mb) 如果我旋转显示器几次,内存就被释放了,一切都很好:scrollview工作正常,内存返回到应该的位置(大约1mb,查看仪器中的净分配) 如何防止内存失控,或者在使用scrollview时释放内存,就像设备旋转一样 以下是为加载scrollview页面而调用的代码段: - (void)load

我希望有人能帮我解决iPhone上的内存问题

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

每当我第一次按下导航控制器并在scrollview中滚动时(边走边添加图像),内存都会被分配成大块(比如说每个1mb)

如果我旋转显示器几次,内存就被释放了,一切都很好:scrollview工作正常,内存返回到应该的位置(大约1mb,查看仪器中的净分配)

如何防止内存失控,或者在使用scrollview时释放内存,就像设备旋转一样

以下是为加载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];
    }
-(void)加载页面:(int)页面当前:(BOOL)当前{
如果(第<0页)返回;
如果(第>=totalRows页)返回;
picViewController*控制器=[[picViewController alloc]init];
如果((NSNull*)[viewControllers objectAtIndex:page]===[NSNull null]){
NSString*fullPath=[self-fullPath];
如果([fileManager fileExistsAtPath:fullPath]){
currentImage=[UIImage imageWithContentsOfFile:fullPath];
[控制器设置img:currentImage];
[viewControllers replaceObjectAtIndex:page with Object:controller];
}
否则{
AsyncImageView*asyncImage=[[AsyncImageView alloc]initWithFrame:[[UIScreen mainScreen]applicationFrame]];
asyncImage.tag=8;
[asyncImage loadImageFromName:imageName with url:url];
[controller.view addSubview:asyncImage];
[图像发布];
[viewControllers replaceObjectAtIndex:page with Object:controller];
}
if(nil==controller.view.superview){
CGRect frame=scrollView.frame;
frame.origin.x=frame.size.width*页;
frame.origin.y=0;
controller.view.frame=frame;
[scrollView添加子视图:controller.view];
}
[控制器释放];
}

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

我看不出您在代码中实际清除屏幕外页面的位置

您的代码有点像苹果的
PageControl
示例,对吗

我所做的是在每次页面“激活”时循环浏览页面,并清除超过1或2个屏幕的页面。(1个用于无弹跳滚动,2个用于有弹跳滚动。)

-(无效)更新检查页{
int active=pageControl.currentPage;
int count=pageControl.numberOfPages;
for(int i=0;i

ScrollViewDiEndDecelling
中调用
updateCachedPages
,页面控件的页面更改操作和
视图将出现

好的,我毕竟没有释放所有内存

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


谢谢你的快速帮助。顺便说一句,这个论坛很棒。

你应该关闭这个问题,这样它就不会出现在未回答的列表上。
- (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 );
    }
}