在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并在打开和关闭它时释放视图。它并没有保留视图对象本身。我很困惑。
不知道在这里做什么。我没有任何泄漏,并且一切正常。任何想法都很棒。
标记
没有找到相关结果
已邀请:
2 个回复
董碘奴星
葛瞎说漓