【问题标题】:Why a UIViewController would stay in memory为什么 UIViewController 会留在内存中
【发布时间】:2013-07-19 21:10:54
【问题描述】:

假设一个视图控制器是这样创建的:

@property (nonatomic, strong) SomeViewController *someViewController;

...

self.someViewController = [[SomeViewController alloc] initWithView:imgView];
[self addChildViewController:self.someViewController];

self.someViewController.view.frame = self.view.bounds;
[self.mainView addSubview:self.someViewController.view];

为什么不被下面放出来?

__weak MainViewController *weakSelf = self;
    self.someViewController.didCloseBlock = ^{

        [weakSelf.someViewController.view removeFromSuperview];
        [weakSelf.someViewController willMoveToParentViewController:nil];
        [weakSelf.someViewController removeFromParentViewController];

        weakSelf.someViewController = nil;

    };

我可以说它没有被释放,因为如果我继续打开和关闭视图控制器(每次打开一个新实例时都会创建一个新实例),它会导致内存不足警告(然后在 iOS5 上崩溃),并且在 @987654323 @,我看到了我创建新 SomeViewController 次数的日志。例如,当我在打开 9 个新的 SomeViewControllers 后收到内存警告时,我会得到 9 个 didReceiveMemoryWarning 日志,表明我在内存中有 9 个 SomeViewController 实例,尽管我在上面的代码中将每个实例都清空了。

【问题讨论】:

    标签: ios memory memory-management memory-leaks uiviewcontroller


    【解决方案1】:

    您使用强注释在您的属性中保留您的视图一次,然后使用self.someViewController = [[SomeViewController alloc] initWithView:imgView]; 再次保留您的视图

    使用综合变量应该可以摆脱这个: _someViewController = [[SomeViewController alloc] initWithView:imgView];

    如果你不使用 ARC,你可以使用self.someViewController = [[[SomeViewController alloc] initWithView:imgView] autorelease];

    我可能会选择第一个选项,不管是否是 ARC。

    【讨论】:

    • 你确定吗?这就是我总是看到它完成的方式。我正在使用 ARC。您将如何更改我的财产声明?
    • 如果你使用 ARC,这是错误的。你可以做self.someViewController = [[SomeViewController alloc] initWithView:imgView];没有任何问题。
    • 您不需要更改属性声明,只需在分配时使用合成对象即可。 _someViewController = 而不是 self.someViewController =
    • @JackyBoy 是正确的,这实际上不应该在 ARC 下产生影响。无论如何都可以试一试,但它可能无法解决您的问题。如果没有,我将删除答案。
    • 此外,您可以尝试将其定义为弱而不是强,或者如果没有理由将其从您的属性声明中完全移除并将其声明为私有 ivar。
    【解决方案2】:

    你只是在设置块didCloseBlock,实际上没有别的。你执行吗?

    【讨论】:

    • 是的,每次关闭视图控制器都会执行didCloseBlock。
    • 一个疯狂的猜测:不要把它作为你真正想要释放的对象的属性。
    猜你喜欢
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 2016-04-16
    相关资源
    最近更新 更多