2011-06-10 55 views
1

我有一个iPad的应用程序,这是儿童书。通过调用这个动作可以从一个页面导航到下一个页面,这个动作必须淡出当前页面并在下一页中淡出,然后用NSArray的下一行填充三个堆栈UIImageView,以便完成操作下一页:内存泄漏警告,由于NSArray的大图像

-(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-12th页:

-(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中加载在控制台中发出警告并且通常会发生崩溃。

我非常确定这只是在正确的时间释放三个大UIImageViews的问题,但我无法弄清楚什么时候......我已经在代码中尝试了许多不同的点。

回答

0

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

您是否还在视图控制器中使图像保留属性?如果是这样,您还需要在dealloc中释放它们。

至于内存警告,您可以在didRecieveMemoryWarning中取消设置图像浏览,然后添加支票以根据需要重新创建它们。

+0

感谢提示家伙,我相信我有我的代码中的所有这些项目,但它仍然给我的问题。我的dealloc是: - (void)dealloc { \t \t [pageImage release]; \t [pageImageBack release]; \t [pageImageNext release]; \t [thePages release]; \t [leftButton release]; \t [rightButton release]; \t [splashView release]; \t \t thePages = nil; \t [super dealloc]; } – Gabe 2011-06-13 13:53:57

+0

并在我的.h文件中我列出了像UIImageViews:@property(nonatomic,retain)IBOutlet UIImageView * pageImage; @property(nonatomic,retain)IBOutlet UIImageView * pageImageBack; @property(nonatomic,retain)IBOutlet UIImageView * pageImageNext;正如Yazu所建议的那样,我也删除了图像扩展版本。在到达第9-15行后仍然会出现内存警告和崩溃......当我从一行移动到另一行时,是否需要释放UIImageView而不是仅仅在(void)dealloc中?或者我需要在另一个时间调用(void)dealloc? – Gabe 2011-06-13 13:57:56

+0

此外,我似乎在控制台中得到这条消息时,它会崩溃,我相信它指向一个内存问题:程序接收到的信号:“0”。 数据格式化程序暂时不可用,将在“继续”后重新尝试。 (未知错误加载共享库“/Developer/usr/lib/libXcodeDebuggerSupport.dylib”) – Gabe 2011-06-13 14:13:23

1

我正在做一个这样的应用程序,我有很多图像视图和标签,用户可以更改。我总是收到警告和崩溃。似乎解决这一切的唯一办法就是让它们成为所有的特性。我想要坚持的一切,我必须做一个财产。这很好地照顾它,否则它看起来像操作系统吓了我,我不得不分配,并会发送内存警告,这将释放的东西,然后当应用程序试图访问它会崩溃。看看是否让你的pageImageNext,pageImage,pageImageBack属性起作用。

+0

嗨Sasquatch,我相信我有UIImageViews设置为h文件中的属性。三个主要的UIImageView中的每一个都被声明为:@property(nonatomic,retain)IBOutlet UIImageView * pageImage;这就是你所说的“让他们成为所有的财产”吗?任何其他帮助,不胜感激。谢谢! – Gabe 2011-06-14 13:06:53

+0

@MishieMoo @zneak @YuzaKen谢谢大家的想法,我实现了他们(或已经有),虽然我仍然遇到崩溃。我添加了一些信息,如果你可能再次检查一下,看看是否有其他建议。 – Gabe 2011-06-14 14:24:43

+0

@加贝我猜你还想改变'else {0} {= {(activePage)* 3); }'到'else { row =((activePage)+ 3); '这就是我的意思是让它们属性,当你释放这些属性?它应该在dealloc中,看起来像'self.pageImage = nil;' – sasquatch 2011-06-14 17:04:34

0

代码:

[imageExtension release]; 

不正确,应予以删除。 “imageExtension”被分配到堆栈上,并在方法退出时消失。只发布你已经分配的东西。

您是否只有这些类型的ViewControllers中的一种?或每个页面一个?

+0

它实际上静态分配在程序的数据段中(一个独立于堆栈和堆的位置),并且释放它什么也不做。在方法调用后它不会消失,你可以'return @“foo”'所有你想要的,没有任何东西会崩溃。也就是说,“只是发布你已经分配的东西”的建议是正确的,尽管你也需要发布你保留的东西(显然)和copy'd。 – zneak 2011-06-10 16:19:06

+0

我只有这些视图控制器之一,它处理三个UIImageViews的所有alpha变化,以及更改每个UIImageView中包含的图像,因为它向上或向下移动NSArray。任何其他帮助,不胜感激。谢谢! – Gabe 2011-06-14 13:08:20

0

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

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