在dismissModalViewControllerAnimated:YES之后,内存仍然徘徊

| 我正在介绍一个模态视图控制器,其中包含带有一堆图像的UIScrollView。当我解散模态视图控制器时,我可以在我的分配(仪器)中看到分配给图像的内存在四处徘徊,但不会引起泄漏。 给我带来一些混乱,任何帮助都会很棒。这就是我所拥有的... UIViewController-DollViewController:这是我正在展示模态的主要视图控制器。这是代码-
-(IBAction)openDollCloset {
    NSLog(@\"Open Closet\");



    [self playSound:@\"soundMenuClick\"];
    ClosetViewController *closet = [[ClosetViewController alloc] initWithNibName:@\"ClosetViewController\" bundle:nil];

    closet.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    [self setModalPresentationStyle:UIModalPresentationFullScreen];
    [self presentModalViewController: closet animated: YES];

    closet.delegate = self;
    closet.addToCloset = NO;
    [closet setCurrentDoll:myDoll];
    [closet openCloset];
    [closet release];

    [self closeSubmenu];

}
我手动创建滚动视图以保存服装图像。 对象closetScroller是通过@property(非原子的,保留的)定义的UIScrollView * closetScroller;与释放dealloc。
- (void)setScrollerValues { 
    if (closetScroller == nil) 
    {
        self.closetScroller = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, 400)];
        [self.closetScroller setDecelerationRate:UIScrollViewDecelerationRateFast];
        [self.closetScroller setDelegate:self];
        [self.closetScroller setPagingEnabled:YES];
        [self.closetScroller setShowsHorizontalScrollIndicator:NO];
        [self.view addSubview:closetScroller];
    }
    [self.closetScroller setContentSize:CGSizeMake(outfitCount * 320, 400)];
}
创建scrollView之后,我将图像添加到滚动条中。我相信我会释放一切正确的。我正在使用NSData对象创建图像并释放它们。
- (void)addOutfitsToScroller {

        // Clear out any old images in case we just deleted an outfit
    if ([[closetScroller subviews] count] > 0) 
    {
        CATransition *fade = [CATransition animation];
        [fade setDelegate:self];
        [fade setType:kCATransitionReveal];
        [fade setSubtype:kCATransitionFromRight];
        [fade setDuration:0.40f];
        [[self.closetScroller subviews] makeObjectsPerformSelector: @selector(removeFromSuperview)];
        [[closetScroller layer] addAnimation:fade forKey:@\"FadeButtons\"];
    }
        // Set the pageControl to same number of buttons
    [pageControl setNumberOfPages:outfitCount];

        // Load the outfit image and add it to the scroller
    for (int i = 0; i < outfitCount; i++) 
    {
        NSArray *savedDataArray = [[NSArray alloc] initWithArray:[closetItemsArray objectAtIndex:i]];
        UIImageView *v = [[UIImageView alloc] initWithFrame:CGRectMake(320*i, 0, 320, 400)];
        [v setUserInteractionEnabled:NO];
        [v setAlpha:0.40f];

        NSData *imageData = [[NSData alloc] initWithContentsOfFile:[savedDataArray objectAtIndex:1]];
        UIImage *outfitImage = [[UIImage alloc] initWithData:imageData];
        UIImageView *closetImage = [[UIImageView alloc] initWithImage:outfitImage];
        [imageData release];
        [outfitImage release];
        [savedDataArray release];

        CGSize frameOffset;
        #ifdef LITE_VERSION
        frameOffset = CGSizeMake(40, 60);
        #else
        frameOffset = CGSizeMake(20, 10);
        #endif
        closetImage.frame = CGRectOffset(closetImage.frame, frameOffset.width , frameOffset.height);

        [v addSubview:closetImage];
        [closetImage release];

        [self.closetScroller addSubview:v];
        [v release];
    }
}
这一切都很好。然后,当用户选择“关闭”按钮或选择我称为的服装时:
[self.delegate closeClosetWindow];
该方法在parentViewController中调用委托方法,该方法只需进行以下调用:
[self dismissModalViewControllerAnimated:YES];
我也尝试过从模态视图控制器本身调用dismissModalViewControllerAnimated:YES。它只是将消息转发到它的parentViewController并关闭模式,与第一种方法相同。两者在内存方面都没有区别。 所以我要做的是使用此方法关闭视图:
[[self.closetScroller subviews] makeObjectsPerformSelector: @selector(removeFromSuperview)];
[self dismissModalViewControllerAnimated:YES];
当我这样做时,我可以看到在Instruments中我的对象分配减少了。在打开壁橱视图之前,我在约1.85mb处分配了对象。当我打开壁橱时,它会增加到2.5左右,具体取决于将多少服装图像加载到UIScrollView中。然后,当我不使用上述方法关闭视图时,它停留在2.5并在下次打开时增加。虽然当使用上述方法从滚动条中删除服装图像时,我的对象分配又回落到1.85mb处。也许更多的信息告诉我它还挂在其他东西上。 还要注意,当查看对象分配时,我确实看到了创建的ClosetViewController对象,并且当我关闭模式时,它的引用被释放。我可以看到它malloc并在打开和关闭它时释放视图。它并没有保留视图对象本身。我很困惑。 不知道在这里做什么。我没有任何泄漏,并且一切正常。任何想法都很棒。 标记
已邀请:
我注意到仪器中的对象分配每次打开模式窗口时都会实时引用UIScrollView。因此,为了解决问题,在分配滚动视图时,我分配了一个新的UIScrollView对象,并将其分配给closetScroller,然后释放。这解决了问题
我认为您只是没有在视图控制器的dealloc中释放closetScroller。

要回复问题请先登录注册