记忆在dismissModalViewControllerAnimated之后徘徊:是的

时间:2011-04-18 22:32:52

标签: memory uiviewcontroller modalviewcontroller

我提出了一个模态视图控制器,它包含一个带有一堆图像的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];

}

我手动创建我的scrollview来保存装备图像。 对象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];

当我这样做时,我可以看到我的对象分配减少了。在打开壁橱视图之前,我有大约1.85mb的对象分配。当我打开衣柜时,它会增加到2.5左右,具体取决于装入UIScrollView的装备图像数量。然后,当我在没有上述方法的情况下关闭视图时,它将保持在2.5并在下次打开时增加。虽然当使用上面的方法从滚动器中删除装备图像时,我的对象alloc会下降到接近1.85mb。也许还有一点,它告诉我它还有其他一些东西。

另请注意,在查看对象分配时,我确实看到创建了ClosetViewController对象,当我关闭模式时,它的refrence被释放。当我打开并关闭它时,我可以看到malloc并释放视图。它不会保留视图对象本身。我很困惑。

不知道该怎么做。我没有得到任何泄漏,我发布的一切都很好。任何想法都会很棒。

标记

2 个答案:

答案 0 :(得分:0)

我注意到每次打开模态窗口时保持对UIScrollView的实时引用的乐器中的对象alloc。所以要修复,在为我的scrollview分配时,我改为分配一个新的UIScrollView对象并将其分配给closetScroller,然后释放。这解决了问题

答案 1 :(得分:0)

我认为你根本没有在视图控制器的dealloc中发布closetScroller。