Memory management 使用ARC添加UIViewController的子视图后如何保留视图

Memory management 使用ARC添加UIViewController的子视图后如何保留视图,memory-management,uiview,Memory Management,Uiview,当我使用ARC并添加UIViewController的视图时,如何处理这种情况 MyViewController *vc = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; [someView addSubview:vc.view]; //this retain vc.view 因为addSubview保留onlu视图,而不是控制器,所以控制器被释放。在ARC之前,有一种方法可以根据需要保留控

当我使用ARC并添加UIViewController的视图时,如何处理这种情况

MyViewController *vc = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
[someView addSubview:vc.view]; //this retain vc.view

因为addSubview保留onlu视图,而不是控制器,所以控制器被释放。在ARC之前,有一种方法可以根据需要保留控制器,但如何防止ARC释放视图控制器?

为什么需要一个新的视图控制器?
MyViewController *vc = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
[someView addSubview:vc.view]; //this retain vc.view

您只需将视图添加为子视图,并使用“someView”的ViewController处理所有问题。

我通过将vc声明为具有默认强属性的属性,解决了类似的问题。

#定义AntiARCRetain(…)void*retainedThing=(bridge_retained void*)_VA_ARGS;保留内容=保留内容


然后调用AntiARCRetain(控制器)

因为当viewcontroller被释放时,视图并没有被释放,如果您试图对视图执行任何与(已经)释放的控制器相关的操作,这将导致崩溃。我认为这是目前唯一的解决方案。只要声明的属性不会更改,视图控制器将保留在内存中,并且始终会重定时控制器的一个副本,即使它已从父视图控制器中删除(自iOS 5.0起使用removeFromParentViewController),它仍会保留该对象。