2011-03-07 76 views
2

因此,看起來我在整個項目中都沒有檢測到泄漏,並且我有很多可以執行各種操作的部分。將UIImageView添加到另一個viewController的視圖中的另一個viewController視圖時的內存管理

但是,我發現我有一些分配問題,在泄漏儀器中使用標記堆證明了這一點,這在大多數情況下是在外部屏幕上使用iPad時發生的。當連接到外部屏幕時,應用程序的行爲會有所不同。

我有一個可縮放的UIScrollView地圖部分,我可以進出。當單獨使用iPad並檢查標記堆時,堆增長最終會降至0字節,這很好。但是,在插入外部屏幕的情況下,圖像被髮送到外部屏幕,該屏幕使用另一個視圖控制器,並且在退出地圖時檢查標記堆大約每次大約6-7MB,而另一個堆沒有太多減少生長。壞。

我發現的事情是,我完全沒有正確處理外部UIImageView的釋放,而且當我剛剛瀏覽它時,這對我來說是顯而易見的。我會稍微解釋一下。

重要的是,在我繼續解釋之前,我爲此做了很長的道歉,但是我發誓我聽說有一個例外,如果將alloc'd對象添加到另一個視圖的另一個視圖中, ,因爲我不擁有它,因此不負責釋放。無論我是否解除分配,我都會得到相同的行爲。但我實際上並不認爲它會解開我目前設置代碼的方式。所以我認爲我的問題是我沒有從內存中釋放圖像視圖......但問題依然存在,在這種情況下,我該怎麼做?

在View A的initWithFrame方法,我的觀點加入到外部屏幕,如果是連接:

if(exScreenEnabled==1){ 
     mapImageViewEx = [[UIImageView alloc] init]; 

     CGPoint p = mapScrollView.contentOffset; 
     mapImageViewEx.frame = CGRectMake((p.x*-1), (p.y*-1), mapImageView.frame.size.width, mapImageView.frame.size.height); 

     NSString *mapExFileLocation = [[NSBundle mainBundle] pathForResource:[map_List objectAtIndex:mapNum] ofType:@"png"]; 
     NSData *mapExIMGData = [NSData dataWithContentsOfFile:mapExFileLocation]; 
     mapImageViewEx.image = [UIImage imageWithData:mapExIMGData]; 

     UIView *containerExViewP = (UIView*)[del.switchExVC.view viewWithTag:9000]; 

     [containerExViewP addSubview:mapImageViewEx]; 

    } 

在外部的viewController的viewDidLoad方法,已經加入了containerView當應用程序啓動和用戶選擇屏幕分辨率。工作幾乎像iPad一樣窗口的顯示控制器,它是用於交換和退出的觀點:

CGRect frame = CGRectMake(0, 0, 1024, 768); 
containerExView = [[UIView alloc] initWithFrame:frame]; 
[containerExView setTag:9000]; 

self.view = containerExView; 

我們只是把這種外部的viewController的「查看B」

,它看起來問題開始的地方:當用戶在地圖上按下後退按鈕時,如果連接了外部屏幕,View A將執行View B偵聽的NSNotificationCenter,以刪除View B容器中的子視圖。以下是視圖B中的方法:

- (void)removeExView{ 
    [[self.view.subviews objectAtIndex:0] removeFromSuperview]; 
    NSLog(@"REMOVED EX VIEW"); 


    UIImage *idleExImage = [UIImage imageNamed:@"idle4.png"]; 
    UIImageView *idleExImageView = [[UIImageView alloc] initWithImage:(UIImage *)idleExImage]; 
    CGRect idleExFrame = CGRectMake(0, 0, 1024, 768); 
    idleExImageView.frame = idleExFrame; 
    [self.view addSubview:idleExImageView]; 

    [idleExImageView release]; 
} 

子視圖從索引0處的視圖B的容器中刪除,然後顯示默認圖像。

所以,我最好的猜測是,即使子視圖被刪除,這是圖像視圖,它不一定從內存中釋放。但你如何訪問這個?這甚至是問題嗎?也許它必須被解除分配,但是永遠不可能達到這一點,因爲首先意外地刪除了視圖。我只是不知道,因爲我不熟悉這種情況應該如何處理。預先感謝您提供的任何幫助。

回答

0

的強硬類猜測在這一點,但我會說這是這些線路

mapImageViewEx = [[UIImageView alloc] init]; 
    // snipped some code for clarity 
    [containerExViewP addSubview:mapImageViewEx]; 

    containerExView = [[UIView alloc] initWithFrame:frame]; 
    // snipped some code for clarity 
    self.view = containerExView; 

這些可以而且應該他們已被添加到視圖層次

[mapImageViewEx release]; 
    [containerExView release]; 

後釋放除非你在上面的代碼片段中沒有顯示某些內容,故意引用這些內容。

+0

在視圖中我有[mapImageViewEx release];在dealloc中,因爲它是在實現中作爲一個靜態的權利:靜態UIImageView * mapImageViewEx ;.它在整個文件中以不同的方法引用。 containerExView在視圖控制器視圖B的dealloc中發佈。 – VagueExplanation 2011-03-07 21:42:16

+0

任何人都可以幫忙嗎? – VagueExplanation 2011-03-11 18:44:04

0

[containerExViewP addSubview:mapImageViewEx];

此行使用後[containerExViewP release];

相關問題