-1

我使用带有 ARC 的 xcode 4.4。我在 ViewController.m 中动态创建了 UIView:

UIView* myviews[10];

然后在 - (void)viewDidLoad 函数中,我用我需要的图片填充每一个

myviews[viewIndex] = [[UIView alloc]initWithFrame:myrec];
UIImage *testImg;
UIImageView * testImgView = [[UIImageView alloc]init];
testImg = [UIImage imageNamed:[NSString stringWithFormat:@"imgarray%d.png", viewIndex];
[testImgView setImage:testImg];
[myviews[viewIndex] addsubView:testImgView];
viewindex++;

所以一切似乎都很好,当我想从一个视图跳到另一个视图时,我接下来使用两个按钮:

[self.view addSubview:views[viewIndex]];
CATransition *animation = [CATransition animation];
[animation setDelegate:self];
[animation setDuration:1.0f];
[animation setType:@"rippleEffect"];
[animation setSubtype:kCATransitionFromTop];
//[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[self.view.layer addAnimation:animation forKey:@"transitionViewAnimation"];

似乎没什么不好,但是当我在视图之间切换时,内存消耗会以巨大的速度增长。然后我会收到内存不足的警告,或者有时应用程序会崩溃。

我尝试使用 UIViewController 数组并在控制器之间切换:没有任何变化,内存不足警告是我最终得到的。

也许我需要以某种方式清理内存?但是怎么做?ARC不允许使用release等..

最后我在添加新子视图之前尝试过(对不起,也许不是很专业)是这个

NSArray *viewsToRemove = [self.view subviews];
                    for (UIView *views in viewsToRemove) {
                        [views removeFromSuperview];
                    }

但这也无济于事。

编辑:我需要澄清一件事:在应用程序执行期间我需要每个 UIView,这意味着我不能在应用程序退出之前释放它。

EDIT2:代码经过编辑,看起来更像真实的代码。

4

4 回答 4

0

为什么不使用 NSMutableArray 来存储视图?它更容易,我敢说,更安全。

而且,当您从超级视图中删除它们时,也将它们从数组中删除

作为一般规则,请记住将其存储到数组中会保留它,删除它会释放它,因此如果将其存储到数组中,然后将其添加为子视图,它将具有保留计数 +2。然后,您将其从 superview 中删除(保留计数 -1),但它仍然是正数,因为它仍在您的数组中。

于 2012-08-28T21:41:45.930 回答
0

一些想法:

首先,复制的代码中有问题,因为您从未创建 testImgView。代替

testImgView.image = testImg;

你需要

testImgView = [UIImageView viewWithImage:image];

其次,您不需要进入图层动画。 请参阅此代码...

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:1.0];
[UIView setAnimationTransition: 110 forView:view cache:NO];  //110 for ripple effect
[UIView commitAnimations];

第三,您可以尝试将所有视图添加到带有标签的 viewDidLoad 中,然后设置为可见。

于 2012-08-28T22:34:16.343 回答
0

如果每次发生过渡时情况都变得更糟,您可以尝试在从超级视图中删除时从图层中删除动画。

NSArray *viewsToRemove = [self.view subviews];
                    for (UIView *views in viewsToRemove) {
                        [views removeFromSuperview];
                        [views.layer removeAllAnimations];
                    }
于 2012-08-29T01:16:39.667 回答
-1

当您使用这样的数组结构(我假设为 ivar)时,ARC 并不真正知道当包含对象的结构消失时它必须释放您的视图。当你清理时,比如在你的-dealloc方法中,你只需要遍历数组并将每个元素设置为 nil,然后 ARC 就会知道释放该视图是可以的。另一种选择是使用Foundation集合类型,例如 anNSMutableArray来保存您的视图,这将使您不必记住清理它们。

例如:

- (void)dealloc
{
  for( int i = 0; i < 10; i++ )
    myviews[i] = nil;
}

如果在应用程序的生命周期中,您将新视图分配到此数组中,没关系,ARC 会做正确的事情。只要确保您将它们排除在外-dealloc。如果您知道以相同的方式完成了它们,也可以提前释放它们,即遍历数组并将 nil 分配给每个元素。

于 2012-08-28T21:51:32.763 回答