从另一个viewController的视图向另一个viewController的视图添加UIImageView时的内存管理

时间:2011-03-07 21:14:33

标签: iphone ipad uiview uiimageview screen

所以看起来我整个项目都没有检测到泄漏,而且我有很多部分可以做各种各样的事情。

然而,我发现我遇到了一些分配问题,在泄漏仪器中使用标记堆证明了这一点,大多数情况下,当使用带有外部屏幕的iPad时。应用程序被编程为在连接到外部屏幕时表现不同。

我有一个可缩放的UIScrollView地图部分,我可以进出。当单独使用iPad并检查标记堆时,堆增长最终将降至0字节,这很好。但是,在插入外部屏幕的情况下,图像将被发送到外部屏幕,外部屏幕使用另一个视图控制器,并且在退出地图时检查标记堆大约每次6-7 MB,而其他堆没有太大减少生长。 BAD。

我发现的是,我完全没有正确处理外部UIImageView的发布,当我只是浏览它时,这对我来说是显而易见的。我会稍微解释一下。

在我继续解释之前很重要,我为这么长时间而道歉,但是我发誓我听说如果从另一个视图添加到另一个视图中,没有在dealloc中放置一个alloc'd对象是个例外,因为我不拥有它,因此不对dealloc'ing负责。无论我是否解除它,我都会得到同样的行为。但实际上我认为它不会像我目前设置的代码那样取消分配。所以我认为我的问题是我没有从内存中释放图像视图......但问题仍然存在,在这种情况下我该怎么做!

在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的“View 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处的View B容器中删除,然后显示默认图像。

所以,我最好的猜测是,即使子视图被删除,这是图像视图,它也不一定从内存中释放出来。但你怎么会这样做?这甚至是问题吗?也许它确实必须被dealloc'd但是永远不能达到这一点,因为视图首先被意外地删除。我只是不知道,因为我不熟悉如何妥善处理这种情况。提前感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分: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];

除非您故意在上述代码段中未明确提及这些内容。

答案 1 :(得分:0)

[containerExViewP addSubview:mapImageViewEx];

在此行之后使用[containerExViewP release];