【问题标题】:Memory keep increasing even though I set it to nil (screenshot enclosed)即使我将它设置为 nil,内存也会不断增加(附上截图)
【发布时间】:2012-12-17 12:37:57
【问题描述】:

在我的 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/

由于这里的声誉低,我无法直接发布图片。

根据图,ParentViewController 大约在第 4 秒被调用。然后内存继续快速增加而没有释放对象。在大约第 30 秒时,ParentViewController 通过单击导航栏上的后退按钮消失。内存减少了一点,但仍然有一些东西。

目标:

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

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

【问题讨论】:

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


    【解决方案1】:

    不确定这是否能解决问题,但请尝试从父视图中显式删除 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;
    

    【讨论】:

    • 你的意思是删除[aUIView addSubview:cvc.view];?但如果我这样做,将不会出现任何视图。由于我使用的是 arc,所以我可以释放的方式设置为 nil。无论如何,谢谢你的回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    相关资源
    最近更新 更多