我提出了一个模态视图控制器,它包含一个带有一堆图像的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并释放视图。它不会保留视图对象本身。我很困惑。
不知道该怎么做。我没有得到任何泄漏,我发布的一切都很好。任何想法都会很棒。
标记
答案 0 :(得分:0)
我注意到每次打开模态窗口时保持对UIScrollView的实时引用的乐器中的对象alloc。所以要修复,在为我的scrollview分配时,我改为分配一个新的UIScrollView对象并将其分配给closetScroller,然后释放。这解决了问题
答案 1 :(得分:0)
我认为你根本没有在视图控制器的dealloc中发布closetScroller。