因此,看起來我在整個項目中都沒有檢測到泄漏,並且我有很多可以執行各種操作的部分。將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的容器中刪除,然後顯示默認圖像。
所以,我最好的猜測是,即使子視圖被刪除,這是圖像視圖,它不一定從內存中釋放。但你如何訪問這個?這甚至是問題嗎?也許它必須被解除分配,但是永遠不可能達到這一點,因爲首先意外地刪除了視圖。我只是不知道,因爲我不熟悉這種情況應該如何處理。預先感謝您提供的任何幫助。
在視圖中我有[mapImageViewEx release];在dealloc中,因爲它是在實現中作爲一個靜態的權利:靜態UIImageView * mapImageViewEx ;.它在整個文件中以不同的方法引用。 containerExView在視圖控制器視圖B的dealloc中發佈。 – VagueExplanation 2011-03-07 21:42:16
任何人都可以幫忙嗎? – VagueExplanation 2011-03-11 18:44:04