Ios 为什么UIViewController会保留在内存中

Ios 为什么UIViewController会保留在内存中,ios,memory,memory-management,memory-leaks,uiviewcontroller,Ios,Memory,Memory Management,Memory Leaks,Uiviewcontroller,假设视图控制器是这样创建的: @property (nonatomic, strong) SomeViewController *someViewController; ... self.someViewController = [[SomeViewController alloc] initWithView:imgView]; [self addChildViewController:self.someViewController]; self.someViewController.vi

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

@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实例,即使我在上面的代码中将每个实例都归零。

您只是设置了block
didCloseBlock
,实际上没有其他设置。你执行它吗

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

使用合成变量应避免以下情况:
\u someViewController=[[someViewController alloc]initWithView:imgView]

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


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

是的,每次关闭视图控制器时都会执行didCloseBlock。胡乱猜测:不要将其作为实际要释放的对象的属性。你确定吗?我总是这么看的。我正在使用ARC。您将如何更改我的财产声明?如果您使用ARC,这是错误的。您可以执行self.someViewController=[[someViewController alloc]initWithView:imgView]没有任何问题。您不需要更改属性声明,只需在分配时使用合成对象即可
\u someViewController=
而不是
self.someViewController=
@JackyBoy是正确的,这在ARC下实际上不会有什么区别。无论如何都可以尝试一下,但它可能无法解决您的问题。如果没有,我将删除答案。此外,您可以尝试将其定义为弱而不是强,或者如果没有理由将其存在,则将其从属性声明中删除,并将其声明为私有ivar。