2011-06-10 48 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的內容,不是嗎?