2011-03-07 45 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];

相关问题