内存泄漏警告,由于NSArray的大图像



我有一个iPad应用程序,那是一本儿童读物。通过调用此操作,您可以从一个页面导航到下一个页面,该操作基本上会淡出当前页面并在下一页中淡出,然后用NSArray的下一行填充三个堆栈UIImageViews,这样就可以完成下一页的操作:

-(void)delayedMethod{
    [leftButton setAlpha:1];
    [pageImageNext setAlpha:0];
    [pageImage setAlpha:1];
    [pageImageBack setAlpha:1];
    NSString *imageExtension = @".jpg";
    NSString *audioExtension = @".wav";
    if (activePage == thePages.count/3)
    {
        activePage = 1;
    }
    else 
    {
        activePage = activePage + 1;
    }
    NSInteger row = 0;
    if(activePage == 0)
    {
        row = activePage;
    }
    else
    {
        row = ((activePage) * 3);
    }   
    [leftButton setAlpha:1];
    pageImageBack.image = [UIImage imageNamed:[NSString stringWithFormat:@"%@%@", [thePages objectAtIndex:row+0], imageExtension]];
    pageImage.image = [UIImage imageNamed:[NSString stringWithFormat:@"%@%@", [thePages objectAtIndex:row+1], imageExtension]];
    pageImageNext.image = [UIImage imageNamed:[NSString stringWithFormat:@"%@%@", [thePages objectAtIndex:row+2], imageExtension]];
    [UIImageView beginAnimations:NULL context:NULL];
    [UIImageView setAnimationDuration:.5]; // you can set this to whatever you like
    /* put animations to be executed here, for example: */
    [leftButton setAlpha:0];
    [rightButton setAlpha:0];
    [leftButton setAlpha:1];
    [rightButton setAlpha:1];
    leftButton.hidden = NO;

    /* end animations to be executed */
    [UIImageView commitAnimations]; // execute the animations listed above
    [imageExtension release];

}

NSArray在该操作中加载,该操作在ViewDidLoad:中调用

-(void)loadPages
{
    thePages = [[NSArray alloc] initWithObjects:
                   //   How many stacked images do we need to get fade in and outs? Also add column fo
                @"page0",@"page0",@"page1",
                @"page0",@"page1",@"page2",
                @"page1",@"page2",@"page3",
                @"page2",@"page3",@"page4",
                @"page3",@"page4",@"page5",
                @"page4",@"page5",@"page6",
                @"page5",@"page6",@"page7",
                @"page6",@"page7",@"page8",
                @"page7",@"page8",@"page9",
                @"page8",@"page9",@"page10",
                @"page9",@"page10",@"page11",
                @"page10",@"page11",@"page12",
                @"page11",@"page12",@"page13",
                @"page12",@"page13",@"page14",
                @"page13",@"page14",@"page15",
                @"page14",@"page15",@"page16",
                @"page15",@"page16",@"page17",
                @"page16",@"page17",@"page18",
                @"page17",@"page18",@"page19",
                @"page18",@"page19",@"page20",
                @"page19",@"page20",@"page21",
                @"page20",@"page21",@"page22",
                @"page21",@"page22",@"page23",
                @"page22",@"page23",@"page24",
                @"page23",@"page24",@"page25",
                @"page24",@"page25",@"page26",
                @"page25",@"page26",@"page27",
                @"page26",@"page27",@"page27",
                nil];
}

这一切都很好,直到第10-12页左右,我开始在控制台中收到内存警告,通常是崩溃。

我很确定这只是在正确的时间发布三个大型UIImageViews的问题,但我不知道什么时候。。。我已经在代码中尝试了许多不同的位置。

我正在做一个这样的应用程序,在那里我有很多图像视图和标签,用户可以更改。我一直收到警告和撞车事故。似乎唯一能解决这一切的就是让它们都成为财产。我想在某个特定的景观上抓住的一切,我都必须建造一处房产。这很好地解决了问题,否则操作系统似乎吓坏了,因为我必须分配太多,会发送内存警告,释放一些东西,然后当应用程序试图访问它们时,它就会崩溃。查看使您的pageImageNext、pageImage、pageImageBack属性是否有效。

确保在视图控制器的dealloc方法中执行[thePages release]];。不发布肯定会导致内存问题。

此外,您是否在视图控制器中保留了图像视图的属性?如果是这样,您还需要在dealloc中发布它们。

至于内存警告,您可以在didRecieveMemoryWarning中取消设置图像视图,然后根据需要添加一个复选框来重新创建它们。

代码:

[imageExtension release];

不正确,应删除。"imageExtension"是在堆栈上分配的,当方法退出时就会消失。只释放你分配的东西。

您是否只有其中一种类型的ViewControllers?还是每页一个?

@sasquatch@YuzaKen@MishieMoo如果我只是简单地设置self.pageImage=nil;正如您所建议的,在dealloc中,这不是只会在用户离开ViewController时释放内存吗?

当我用新图像替换UIImageView的内容时,我觉得我需要在数组的各行下移时释放UIImageView,不是吗?

最新更新