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

@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上崩溃),并且在SomeViewController didReceiveMemoryWarning中,我看到了一个记录我创建新的SomeViewController的次数。例如,当我打开9个新的SomeViewControllers后收到内存警告时,我将获得9个didReceiveMemoryWarning日志,表明我在内存中有9个SomeViewController实例,即使我在上面的代码中将每个实例都删除了。

最佳答案

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

使用综合变量应该摆脱这种情况:_someViewController = [[SomeViewController alloc] initWithView:imgView];
如果您不使用ARC,则可以使用self.someViewController = [[[SomeViewController alloc] initWithView:imgView] autorelease];
我可能会选择第一个选项,虽然不是ARC。

08-05 23:08