内存不断增加,即使我将其设置为零(截图已封闭)

时间:2012-12-17 12:37:57

标签: objective-c memory-management automatic-ref-counting viewwillappear

在我的ParentViewController中,我输入:

- (void)updateView:(NSInteger)_index article:(AObject *)aObject {

    UIView *aUIView = [someUIViews objectAtIndex:_index];

    // clear view
    for (UIView *view in aUIView.subviews) {
        [view removeFromSuperview];
    }

    // create view
    ChildViewController *cvc = [[ChildViewController alloc] init:aObject context:managedObjectContext];
    cvc.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
    [self addChildViewController:cvc];
    [aUIView addSubview:cvc.view];
    cvc = nil;
}

在ChildViewController中我输入:

.h文件

@interface ChildViewController : UIViewController <UIWebViewDelegate> {
    AObject *aObject;
    UIWebView *webView;
}

.m文件

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:(BOOL)animated];
    webView.delegate = nil;
    webView = nil;
    aObject = nil;
}

注:

  • 我必须使用 addChildViewController ,因为我在 ChildViewController 中使用 UIWebViewDelegate 。如果我不使用 addChildViewController ,我就无法保留ViewController,并且无法调用 UIWebViewDelegate 的功能。
  • 我使用ARC

计划目标:

  • 有一个由UIScrollView实现的滚动视图,每次我将屏幕滚动到另一个页面时,都会调用函数 updateView
  • 滚动到另一个页面后,上一页将消失,因此将调用 ChildViewController 中的 viewWillDisappear

截图:

http://postimage.org/image/mzmksm9d5/

我不能直接发布图片,因为这里的声誉很低。

根据图,大约第4秒调用 ParentViewController 。然后内存在没有释放对象的情况下迅速增加。大约在第30秒,单击导航栏上的后退按钮, ParentViewController 就消失了。记忆力下降了一些,但仍有一些事情在继续。

目标:

我希望做的是,当调用 viewWillDisappear 并且不再使用它时,可以销毁 ChildViewController 的对象。所以我希望在增加一点后内存总是会下降。否则,内存将与滚动时间成比例增加并崩溃,直到内存完全使用。

提前感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:0)

不确定这是否可以解决问题,但请尝试从父视图中明确删除cvc.view。

此外,您正在创建ChildViewController,但您没有发布它。通过调用init,您可以增加其保留计数,但不会在任何地方减少它。像这样(如果你没有更多的代码),你的ChildViewController将不会被释放,因为保留计数永远不会再为0。

ChildViewController *cvc = [[ChildViewController alloc] init:aObject context:managedObjectContext];
cvc.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
[self addChildViewController:cvc];
[aUIView addSubview:cvc.view];
cvc = nil;