Objective c 是否需要在ARC中释放子视图?

Objective c 是否需要在ARC中释放子视图?,objective-c,xcode,automatic-ref-counting,Objective C,Xcode,Automatic Ref Counting,如果使用ARC在XCode中创建UIViewController,则ViewDiUnload:方法定义如下: - (void)viewDidUnload { [super viewDidUnload]; // Release any retained subviews of the main view. // e.g. self.myOutlet = nil; } 如果在XIB中创建一个按钮,此代码将自动插入方法顶部: [self setSomeButton:nil];

如果使用ARC在XCode中创建UIViewController,则
ViewDiUnload:
方法定义如下:

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}
如果在XIB中创建一个按钮,此代码将自动插入方法顶部:

[self setSomeButton:nil];

ARC是否需要这些代码?

这不受ARC的影响。您仍然必须将您的强IBO设置为零


不过,它受到iOS 6的影响。但目前这属于保密协议。

重要的是要记住,在大多数情况下,
viewDidUnload
永远不会被调用。根据我的经验,只有当您的VC在导航堆栈中“高于”当前VC并且在屏幕外且内存不足时,才会调用它

据我所知,苹果公司将该代码放在那里是为了提醒您,在这种情况下,您的子视图已经消失


请注意,他们没有将该代码放入
dealloc
,因为(正如您正确地假设的那样)ARC会为您进行清理(因为这些通常是弱点)

您能解释一下吗?为什么我们仍然必须将strong IBOutlets设置为nil?(并且只有IBOutlets视图,而不是非XIB视图?)当然,您仍然必须发布ivar、properties以及任何您对它们有强烈引用的地方的所有视图。原因是ARC只是在不再有强参照时自动释放对象。由于视图控制器仍然存在,它必须放弃它的引用。这种情况并不少见:当您的视图不在屏幕上且内存紧张时。我真正的意思是,“它不是默认视图生命周期的一部分”。我想,关于它实际发生频率的细节在很大程度上取决于太多的因素,无法做出单一的表征。