2

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

@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 个新的 SomeViewController 后收到内存警告时,我会收到 9 个 didReceiveMemoryWarning 日志,这表明我在内存中有 9 个 SomeViewController 实例,尽管我在上面的代码中将每个实例都清空了。

4

2 回答 2

0

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

于 2013-07-20T18:55:38.390 回答
0

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

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

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

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

于 2013-07-20T18:59:31.197 回答